1

我对 Java 反射有疑问。这是我的代码非常简化。

假设我们有这个类:

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

    ...
}

还有这个类(用作 MyClassA 的属性:

public class MyClassB {

    private int myProperty;

    public MyClassB(){
    }

    ...
}

我想使用 Java Reflection 来做这样的事情,在MyClassA

    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...)
}

我怎么能这样做?

4

2 回答 2

3

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

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!
于 2012-07-25T15:01:22.507 回答
0

因此,如果我说得对,您是否希望获取字段 myPropertyB_1 以防您使用 '1' 作为 id 调用 methodThatUsesReflectionOnProperty?

在这种情况下,只需使用 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);
   }
}
于 2012-07-25T15:05:11.890 回答