2011-10-26 20 views
0

有以下標註了實例化對象由它的路徑從註釋財產

@Trackable(builder = "pkg1.SomeVO") 
public class MyService 

pkg1.SomeVO - 是Java對象的路徑,它應該在我的方面類中進一步實例化。

4.我得到的字符串值爲build,即等於'pkg1.SomeVO'反射。

問題是,實際如何實例化SomeVO對象?
我需要它:
MyBuilder mb=new SomeVO(); 其中MyBuilder是已定義的抽象類。

它可以是任何對象,例如, G。 SomeVO2等,所以我絕對不知道我的方面(見步驟3),應該實例化哪個類。

回答

0

通過路徑假設,您的意思是您的類所在的包(希望在類路徑中)。

String myClass = getClassNameFromAnnotationReflectively(); // YOU define this method... 
Class<SomeVO> someVoClass = Class.forName(myClass); 
SomeVO someVo = someVoClass.newInstance(); 

如果您class沒有一個默認的構造函數,你可以找到使用getConstructor(Class<?> ...)(你的類型,你正在尋找的構造函數的參數傳遞),然後調用newInstance(Object...)在適當的一個(通過實際值)。

Class對象上有很多有趣的方法可用。我建議看看。

+0

nicholas,我不知道,它是SomeVO類particulary.I的意思是,你的代碼的第一行假設,我們絕對應該知道,它是SomeVO。 – sergionni

+0

@sergionni,在你的問題中,第4點表明你已經有了使用反射的builder的字符串值。以'String'來代替我的例子中的硬編碼。 –

2

做這樣的事來獲得註解值並創建類。此外,您可能希望在註釋中使用默認值字段和Class而不是String,以使事情更輕鬆。

for (Method m : MyService.class.getDelcaredMethods()) 
    if (m.getAnnotation(Trackable.class) != null) { 
     String className = m.getAnnotation(Trackable.class).builder() 
     Class.forName(className).newInstance(); 
    } 

如果你的類有你需要弄清楚的ARG它沒有默認構造函數:

for (Constructor c : Class.forName(className).getConstructors()) 
    if (c.getParameterTypes() == /* your expected arg types */) 
     return c.newInstance(/* your args */); 

爲了確保您的類是某種類型(如MyBuilder),你可以讓你的註解:

public @interface Trackable { 
    Class<? extends MyBuilder> value() 
} 
+0

好點,其實我錯過了關於Class的問題。讓我檢查一下,我會盡快給你反饋。 – sergionni

+0

該方法放在'TYPE'上,而不是'METHOD'。雖然:) –

+0

Class.forName(className).newInstance()創建一個新的實例。我怎樣才能真正使用它來設置特定的字段? – sergionni