簡體   English   中英

Java Reflection getConstructor方法

[英]Java Reflection getConstructor method

假設我有AB類,其中B延伸A 我在B也有一個構造函數,其中一個參數是A類型。 我還有一個名為bObj B型對象。

有沒有辦法調用B.class.getConstructor(new Class[] { bObj.getClass() })並獲得構造函數,因為B擴展了A 目前我正在收到NoSuchMethodException

此致,斯坦

我建議你看一下Apache Commons LangConstructorUtils
他們擁有構造函數發現方法的所有方式。

您的案例應由“ 匹配可訪問的構造函數 ”涵蓋。

以下是上下文中使用的方法的示例。 基本上,你這樣稱呼它:

 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 Reflectcommons beanutils等框架。 或者你必須調用getConstructors()並編寫自己的過濾器代碼。

乍一看,這看起來很愚蠢:如果Java編譯器可以做到,為什么不能使用Reflection API? 有兩個原因:首先,Java運行時不需要搜索要調用的方法,因為編譯器已經選擇了正確的方法。

第二個原因是Reflection API總是“次佳”。 它可以做任何事情,但目標永遠不會讓它變得非常容易/友好使用(至少,這就是我每次使用它時的想法:-)

如果您的構造函數不是公共的(或者它的類不是公共的),或者無法從您的代碼范圍訪問,則不會通過

Class.getConstructor()

嘗試

Class.getDeclaredConstructor()

代替

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM