java反射System.out.println

Nik*_*eeK 2 java reflection

我正在学习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)

Sot*_*lis 6

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)