【问题标题】:Invoke a method of a private object defined in a class (Java reflection)调用类中定义的私有对象的方法(Java 反射)
【发布时间】:2014-01-08 13:59:26
【问题描述】:

我有一堂课:

public class MyClass {

  private final AnotherClass myField = new AnotherClass() {
       @Override
       public long getSize() { 
            ...
       }
}

我已经得到了MyClass的Class对象:

Class<MyClass> myClazz = LOAD_CLASS("MyClass");

如何使用Java反射调用MyClass中定义的myField的getSize()方法?

【问题讨论】:

  • @Kevin,我看不到您的链接如何回答我的问题。我的问题不仅仅是如何加载字段,还有如何调用字段的getSize()函数。
  • 它描述了如何设置字段的可访问性,这将允许您通过反射访问私有字段。
  • @Kevin,我明白了,但我的关键问题是如何调用私有字段的功能,您的链接对此没有参考。

标签: java reflection


【解决方案1】:

您必须使用Field#setAccessible(boolean b) 方法才能访问私有字段。

你可以这样做:

MyClass obj = new MyClass();
try {
    Field field = obj.getClass().getDeclaredField("myField");
    field.setAccessible(true);
    AnotherClass privateField = (AnotherClass) field.get(obj);
    long size = privateField.getSize(); //invoke the getSize() method
    field.setAccessible(false);
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

【讨论】:

  • 但是我不能像你的代码显示的那样声明 AnotherClass 类型,因为我需要在运行时加载所有内容,而不是编译时
  • @KevinBowersox 仅为该 Field 实例设置可访问性,以后对 getDeclaredFields 的调用会返回新实例。所以你可以让它超出范围,你会没事的。
【解决方案2】:

您需要在myField 对象上使用getDeclaredMethod:

Field field = obj.getClass().getDeclaredField("myField");
field.setAccessible(true);

Object privateField = field.get(obj);

Method getSizeMethod = privateField.getClass().getDeclaredMethod("getSize");

Long result = (Long)getSizeMethod.invoke(privateField);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2020-03-26
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多