如何在Java中动态实例化和调用类成员的方法?

时间:2012-07-25 14:55:35

标签: java reflection dynamic

我有Java Reflection的问题。这是我的代码非常简化。

假设我们有这个课程:

public class MyClassA {
    private MyClassB myPropertyB_1;
    private MyClassB myPropertyB_2;

    ...
}

这个类(用作MyClassA的属性:

public class MyClassB {

    private int myProperty;

    public MyClassB(){
    }

    ...
}

我想在MyClassA

中使用Java Reflection做这样的事情
    public void methodThatUsesReflectionOnProperty(int id){
        // 1. Get the field using id
        // 2. Instantiate this field dynamically (i.e. new MyClassB() )
        // 3. Invoke some methods on this field dynamically (setters, addlisteners...)
}

我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

您可以使用以下字段获取字段:

classObject.getDeclaredField(String fieldName);

您可以使用以下方法获取方法:

classObject.getDeclaredMethod(String methodName, Class<?> ... parameterTypes);

如果有默认构造函数,当然可以用newInstance()实例化它。

例如:

ClassA aObj = new ClassA();

// field access
Field field = ClassA.class.getDeclaredField("objectB");
Object bObj = field.getType().newInstance();
field.setAccessible(true); // as it is private it needs to be accessible first
field.set(aObj, bObj); // set bObj into field from aObj

// invoking method
Method method = bObj.getClass().getDeclaredMethod("methodB", String.class);
method.invoke(bObj, "reflection test!");

这将打印:

B wrote: reflection test!

答案 1 :(得分:0)

所以,如果我找到了你想要获得字段myPropertyB_1,以防你调用带有'1'的methodThatUsesReflectionOnProperty来获取id?

在这种情况下,只需使用Map而不是反射。这看起来像是:

public class MyClassA {
   private Map<Integer,MyClassB> myProperty;

   public void initMethod(Integer i) {
       if(this.myProperty.get(i)!=null)return;
       MyClassB myClassB = new MyClassB();
       this.myProperty.set(i, myClassB);
   }
}