2011-02-04 65 views
2

我正在開發一個應用程序,它使用Java接口作爲而不是Java接口,即在運行時,用戶應該能夠列出接口類中的可用方法,任何事情:Java Interface Reflection Alternatives

private Class<? extends BaseInterface> interfaceClass. 

在運行時,我想枚舉可用的方法,然後基於用戶選擇,調用某種方法。

我的問題是:Java「接口」體系結構是否提供了任何方法讓我在不使用Reflection API的情況下查看和調用方法?

我希望有這樣的事情(也許有):

private Interface<? extends BaseInterface> interfaceAPI; 

public void someMethod(){ 
interfaceAPI.listMethods(); 
interfaceAPI.getAnnotations(); 
} 

也許有某種方式使用泛型類型來完成我想要什麼?

感謝,

費德魯斯

+0

還有其他的方法,但他們恕我直言,差遠了。你沒有說過你爲什麼不想使用反思。也許你的擔心可以解決。 – 2011-02-04 15:24:01

+0

您可以即時生成代碼(並通過一些自定義類加載器加載它)......但這就是反射實際上所做的。 – bestsss 2011-02-04 18:55:55

回答

5

這正是Reflection的目的所在。

1

我的問題是:是否在Java「接口」架構提供任何方法對我來說,偷看並調用方法,而無需使用反射API?

一)沒有,反思是做

B)不這樣做,在所有的唯一途徑。如果您需要動態語言,請使用Groovy。它的語法(可以)與java幾乎相同,但它已經包含了大部分已經內置的功能。 (許多其他語言也可以工作,但Groovy在比較語法時最接近Java)

+0

w/javascript有什麼不對?它甚至可以在java本身? – bestsss 2011-02-04 19:40:39

1

反射是列出任意對象方法的唯一方法。那麼,解析字節碼也是可行的,但它很乏味。

0

不幸的是,它看起來像反射是唯一的出路。不幸的是,反思不僅速度慢,而且編程和維護都很麻煩。所以我建議你使用apache bean util庫。 (具體爲methodutils。)

1

看看Apache Commons BeanUtils。這是一個很好的庫,用於以編程方式發現對象的方法和屬性很容易(即不寫低級別反射代碼)。我用過幾個項目。它還提供了一個更簡單的API,用於在發現這些對象成員後訪問它們。 PropertyUtilsMethodUtils是開始的好地方。

0

雖然這裏沒有辦法反思,但如果使用註釋來標記可調用方法,則可以使其相對無痛。此工作方法的一個示例是爲webservices設置的javax.jws註釋。這裏使用的想法可能非常有用,例如,您可以爲每個方法/參數定義一個顯示名稱。

0

反思與註釋工作奈斯利

for (Method m : interfaceClass.getMethods()) { 
     if (m.isAnnotationPresent(UIf.class)) { 
      UIf x = m.getAnnotation(UIf.class); 
      addDefinedCommand(new CommandDef(
        interfaceClass, 
        u, 
        x.name().isEmpty() ? m.getName() : x.name(), 
        x.description()) 
      ); 
     } 
}