[英]Java Reflection getConstructor method
假設我有A
和B
類,其中B
延伸A
我在B
也有一個構造函數,其中一個參數是A
類型。 我還有一個名為bObj
B
型對象。
有沒有辦法調用B.class.getConstructor(new Class[] { bObj.getClass() })
並獲得構造函數,因為B
擴展了A
? 目前我正在收到NoSuchMethodException
。
此致,斯坦
我建議你看一下Apache Commons Lang的ConstructorUtils
。
他們擁有構造函數發現方法的所有方式。
您的案例應由“ 匹配可訪問的構造函數 ”涵蓋。
以下是上下文中使用的方法的示例。 基本上,你這樣稱呼它:
private <T> T instantiate(Class<?> input, Object parameter) {
try {
Constructor<?> constructor = ConstructorUtils.getMatchingAccessibleConstructor(input, parameter.getClass());
return (T) constructor.newInstance(parameter);
} catch (Exception e) {
//handle various exceptions
}
}
不,搜索您的方法需要精確的參數。 因此,當您使用反射API的查找/搜索方法查找構造函數,方法或字段時,API使用equals()
來查找匹配項。
如果您需要與Java編譯器相同的邏輯,則需要使用FEST Reflect或commons beanutils等框架。 或者你必須調用getConstructors()
並編寫自己的過濾器代碼。
乍一看,這看起來很愚蠢:如果Java編譯器可以做到,為什么不能使用Reflection API? 有兩個原因:首先,Java運行時不需要搜索要調用的方法,因為編譯器已經選擇了正確的方法。
第二個原因是Reflection API總是“次佳”。 它可以做任何事情,但目標永遠不會讓它變得非常容易/友好使用(至少,這就是我每次使用它時的想法:-)
如果您的構造函數不是公共的(或者它的類不是公共的),或者無法從您的代碼范圍訪問,則不會通過
Class.getConstructor()
嘗試
Class.getDeclaredConstructor()
代替
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.