gpt4 book ai didi

java反射System.out.println

转载 作者:行者123 更新时间:2023-12-04 03:59:00 24 4
gpt4 key购买 nike

我正在学习 Java 反射。我试过了

System.exit(3);Class.forName("java.lang.System").getMethod("exit", Integer.TYPE).invoke(null, 3);

and it works. I successfully also ran

System.out.println(Class.forName("java.lang.System").getMethod("currentTimeMillis").invoke(null)); 

Now how can i invoke System.out.println reflectively

java.lang.Class.forName("java.lang.System").getMethod("out.println", String.class).invoke(null, "Hi!"); 

is giving error.I know System does not have out function. So suggest a way to call System.out.println reflectively

Here is the complete example

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!");
}
}

最佳答案

outjava.lang.System 类的一个 static 字段。

你可以使用Field类来引用它

Class<?> systemClass = java.lang.Class.forName("java.lang.System");
Field outField = systemClass.getDeclaredField("out");

该字段的类型是 PrintStream。您不需要真的知道这一点,但您确实需要为它检索相应的 Class 对象。

Class<?> printStreamClass = outField.getType();

我们知道它有一个 println(String) 方法,所以我们也可以检索它

Method printlnMethod = printStreamClass.getDeclaredMethod("println", String.class);

现在,自 println(String)是实例方法,我们需要在实例上调用它。哪个实例? out 字段引用的那个。 out 字段是static,因此我们可以通过将null 传递给Field#get(object) 来获取它。 .

Object object = outField.get(null);

然后我们调用方法

printlnMethod.invoke(object, "Hi!");

关于java反射System.out.println,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23019482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com