我正在学习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!");
给出错误.我知道系统没有功能.因此,建议一种反射性地调用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!");
}
}
Run Code Online (Sandbox Code Playgroud)
out是一个班级的static领域java.lang.System.
您可以使用Field该类来引用它
Class<?> systemClass = java.lang.Class.forName("java.lang.System");
Field outField = systemClass.getDeclaredField("out");
Run Code Online (Sandbox Code Playgroud)
该字段的类型是PrintStream.您不需要确实知道,但您确实需要为其检索相应的Class对象.
Class<?> printStreamClass = outField.getType();
Run Code Online (Sandbox Code Playgroud)
我们知道它有一个println(String)方法,所以我们也可以检索它
Method printlnMethod = printStreamClass.getDeclaredMethod("println", String.class);
Run Code Online (Sandbox Code Playgroud)
现在,因为println(String)是一个实例方法,我们需要在一个实例上调用它.哪个实例?该out字段引用的那个.那个out领域是static如此我们可以通过传递null来获得它Field#get(object).
Object object = outField.get(null);
Run Code Online (Sandbox Code Playgroud)
然后我们调用该方法
printlnMethod.invoke(object, "Hi!");
Run Code Online (Sandbox Code Playgroud)