我正在学习java反射。我试过了。
System.exit(3);
Class.forName("java.lang.System").getMethod("exit", Integer.TYPE).invoke(null, 3);
它很有效。我还成功地
System.out.println(Class.forName("java.lang.System").getMethod("currentTimeMillis").invoke(null));
现在,我如何反射式地调用System.out.println
java.lang.Class.forName("java.lang.System").getMethod("out.println", String.class).invoke(null, "Hi!");
正在给出错误。我知道系统没有out函数。因此建议一种方法来反射性地调用System.out.println
下面是完整的示例
public class ReflectionDemo1 {
public static void main(String[] args) throws Exception {
// java.lang.System.exit(3);
// java.lang.Class.forName("java.lang.System").getMethod("exit", Integer.TYPE).invoke(null, 3);
// java.lang.System.currentTimeMillis()
// System.out.println(Class.forName("java.lang.System").getMethod("currentTimeMillis").invoke(null));
// System.out.println("Hi!");
java.lang.Class.forName("java.lang.System").getMethod("out.println", String.class).invoke(null, "Hi!");
}
}
2条答案
按热度按时间fiei3ece1#
out
是java.lang.System
类别的static
字段。您可以使用
Field
类来引用它该字段的类型是
PrintStream
,您实际上并不需要知道它,但您确实需要为它检索相应的Class
对象。我们知道它有一个
println(String)
方法,所以我们也可以检索它现在,由于
println(String)
是一个示例方法,我们需要在一个示例上调用它。哪个示例?被out
字段引用的那个示例。那个out
字段是static
,所以我们可以通过将null
传递给Field#get(object)
来得到它。然后调用方法
qncylg1j2#
我遇到了同样的挑战,而工作,通过“核心Java的不耐烦”的Cay S. Horstmann(优秀阅读顺便说一句)。
https://horstmann.com/javaimpatient/的最大值
首先,使用反射
getField
方法获取Field对象。现在从
Field
对象的底层值获取Method
对象。在本例中,它是System
类的静态字段out
。由于null
是静态字段,因此可以将其作为参数传入。最后,使用
Field
对象的基础值叫用方法。