我有Java Reflection的问题。这是我的代码非常简化。
假设我们有这个课程:
public class MyClassA {
private MyClassB myPropertyB_1;
private MyClassB myPropertyB_2;
...
}
这个类(用作MyClassA的属性:
public class MyClassB {
private int myProperty;
public MyClassB(){
}
...
}
我想在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...)
}
我怎么能这样做?
答案 0 :(得分:4)
您可以使用以下字段获取字段:
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!
答案 1 :(得分:0)
所以,如果我找到了你想要获得字段myPropertyB_1,以防你调用带有'1'的methodThatUsesReflectionOnProperty来获取id?
在这种情况下,只需使用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);
}
}