2012-07-25 24 views
1

我有一個Java反射的問題。這是我的代碼非常簡化。如何動態實例化和調用Java中的類成員的方法?

比方說,我們有這個類:

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

    ... 
} 

而這個類(用作MyClassA屬性:

public class MyClassB { 

    private int myProperty; 

    public MyClassB(){ 
    } 

    ... 
} 

我想用Java反射做這樣的事情在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...) 
} 

我怎麼能這樣做

+2

是否有可能您可以考慮重新設計,不需要您使用反射?要求這樣做似乎很難(如果你完全控制了這些類)。例如,你可以在'MyClassA'中維護一個屬性列表,並提供getter setter方法來允許其他類訪問和修改它們? – 2012-07-25 14:58:11

+0

其實我正在開發Android,並試圖自動生成窗體和字段列表,我考慮重構所有內容,但似乎不可能。 – cleroo 2012-07-25 15:02:56

回答

4

你可以得到使用領域:

classObject.getDeclaredField(String fieldName); 

您可以使用get方法:

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! 
+0

是的,但如何做:例如'myPropertyB_1 = new MyPropertyB()'與反射?因爲'getDeclaredField(String fieldName)'返回一個字段而不是MyPropertyB。 – cleroo 2012-07-25 15:05:17

+0

做了樣本幫助? – 2012-07-25 15:21:10

+0

是的!謝謝:) – cleroo 2012-07-25 15:22:38

0

所以,如果我得到你的權利,你想如果你用「1」調用methodThatUsesReflectionOnProperty的id字段myPropertyB_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); 
    } 
} 
+0

實際上我使用了很多地圖,並且想用Reflection來重構^^ – cleroo 2012-07-25 15:06:18

+0

但是爲什麼呢?正如@Duncan Jones所說的那樣,反射方法似乎很醜陋;) – sics 2012-07-25 15:08:58

相關問題