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

では、id に '1' を指定して methodThatUsesReflectionOnProperty を呼び出す場合に備えて、フィールド myPropertyB_1 を取得しますか?

この場合、リフレクションの代わりにマップを操作してください。これは次のようになります。

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 に答える