java反射系统

evrscar2  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(215)

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

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

它很有效。我还成功地

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

现在,我如何反射式地调用System.out.println

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

正在给出错误。我知道系统没有out函数。因此建议一种方法来反射性地调用System.out.println
下面是完整的示例

  1. public class ReflectionDemo1 {
  2. public static void main(String[] args) throws Exception {
  3. // java.lang.System.exit(3);
  4. // java.lang.Class.forName("java.lang.System").getMethod("exit", Integer.TYPE).invoke(null, 3);
  5. // java.lang.System.currentTimeMillis()
  6. // System.out.println(Class.forName("java.lang.System").getMethod("currentTimeMillis").invoke(null));
  7. // System.out.println("Hi!");
  8. java.lang.Class.forName("java.lang.System").getMethod("out.println", String.class).invoke(null, "Hi!");
  9. }
  10. }
fiei3ece

fiei3ece1#

outjava.lang.System类别的static字段。
您可以使用Field类来引用它

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

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

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

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

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

现在,由于println(String)是一个示例方法,我们需要在一个示例上调用它。哪个示例?被out字段引用的那个示例。那个out字段是static,所以我们可以通过将null传递给Field#get(object)来得到它。

  1. Object object = outField.get(null);

然后调用方法

  1. printlnMethod.invoke(object, "Hi!");
展开查看全部
qncylg1j

qncylg1j2#

我遇到了同样的挑战,而工作,通过“核心Java的不耐烦”的Cay S. Horstmann(优秀阅读顺便说一句)。
https://horstmann.com/javaimpatient/的最大值
首先,使用反射getField方法获取Field对象。

  1. Field f = System.class.getField("out")

现在从Field对象的底层值获取Method对象。在本例中,它是System类的静态字段out。由于null是静态字段,因此可以将其作为参数传入。

  1. Method m = f.get(null).getClass().getMethod("println", String.class);

最后,使用Field对象的基础值叫用方法。

  1. m.invoke(f.get(null), "Hello, World");

相关问题