[英]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.