簡體   English   中英

如何在Java中動態實例化和調用類成員的方法?

[英]How to instantiate and call methods dynamically of a class member in Java?

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

我怎么能這樣做?

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

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!

所以,如果我找到了你想要獲得字段myPropertyB_1,以防你調用methodThatUsesReflectionOnProperty,id為'1'?

在這種情況下,只需使用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);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM