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

如何在Java中动态实例化和调用类成员的方法?,java,reflection,dynamic,Java,Reflection,Dynamic,我对Java反射有一个问题。这是我非常简化的代码 假设我们有这样一门课: public class MyClassA { private MyClassB myPropertyB_1; private MyClassB myPropertyB_2; ... } 以及该类(用作MyClassA的属性): public class MyClassB { private int myProperty; public MyClassB(){ }

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

假设我们有这样一门课:

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

    ...
}
以及该类(用作MyClassA的属性):

public class MyClassB {

    private int myProperty;

    public MyClassB(){
    }

    ...
}
我想在
MyClassA
中使用Java反射来做类似的事情:

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

我如何才能做到这一点?

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

classObject.getDeclaredField(String fieldName);
您可以使用以下方法获取方法:

classObject.getDeclaredMethod(String methodName, Class<?> ... parameterTypes);
这将打印:

B wrote: reflection test!

如果我没弄错的话,你想得到字段myPropertyB_1,以防调用使用id为“1”的ReflectionOnProperty的方法

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

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);
   }
}
公共类MyClassA{
私有财产;
公共void initMethod(整数i){
if(this.myProperty.get(i)!=null)返回;
MyClassB MyClassB=新的MyClassB();
this.myProperty.set(i,myClassB);
}
}

你有没有可能考虑不需要使用反射的重新设计?如果需要的话,看起来很难看(如果你完全控制了类)例如,你能在
MyClassA
中维护一个属性列表,并提供getter setter方法来允许其他类访问和修改它们吗?事实上,我正在Android上开发并尝试自动生成表单,带有一个字段列表,我考虑过重构所有内容,但似乎不可能。是的,但如何实现o例如:
myPropertyB\u 1=new myPropertyB()
带反射?因为
getDeclaredField(String fieldName)
返回一个字段而不是myPropertyB。我不知道如何使用该字段,使用getType().newInstance(),然后设置(…).很难猜测^^^以及如何获得具有参数的构造函数。我必须做…newInstance(这个);事实上,我使用了很多映射,并且希望使用反射进行重构^^^^但这是为什么呢?正如@Duncan Jones所说,反射方法似乎很难看;)
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);
   }
}