2016-09-01 70 views
1

這是我第一次使用反射並且不知道我在實例化受保護的構造函數時出現了什麼錯誤。下面是我的代碼來實例化JsonProcessingException的構造函數。NoSuchMethodException當使用反射來實例化受保護的構造函數時

getDeclaredConstructor正在引發NoSuchMethodException,雖然此異常類具有帶有一個,兩個和三個參數的受保護構造函數。

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class 
     .getDeclaredConstructor(Object.class, Object.class); 
constructor.setAccessible(true); 

我的假設:我已閱讀,我們可以使用反射實例化私有構造所以我假設proteted也被實例化。

回答

2

您還必須考慮構造函數的參數類型不僅數字。 JsonProcessingException沒有一個構造函數需要兩個Object s作爲參數,但一個需要StringJsonLocation以及一個需要StringThrowable。要進入第二個構造函數寫這樣的:

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class 
     .getDeclaredConstructor(new Class[]{String.class, Throwable.class}); 
constructor.setAccessible(true); 
JsonProcessingException ex = constructor.newInstance(msg, throwable); 

http://tutorials.jenkov.com/java-reflection/constructors.html

2

你的方法幾乎是正確的,但你試圖反映不存在的構造函數。您必須通過正確的簽名,例如

JsonProcessingException.class 
    .getDeclaredConstructor(String.class, Throwable.class) 
+0

看是不是通過Object.class得到單個參數的任何構造的一種通用的方式? –

+1

@Vishwanathgowdak否(除非參數類型真的和'Object')。你必須知道參數類型。如果你需要不那麼嚴格的匹配,那麼你應該遍歷'getDeclaredConstructors()'來找到哪個構造函數是合適的 – vsminkov

相關問題