0
使用泛型並需要在運行時創建泛型類的實例,所以我試圖使用getConstructor()。不幸的是,儘管有正確的簽名,我仍然收到了NoSuchMethodException,所以我不知道什麼是錯的。我會很感激你的建議,所以我可以超越這個問題。 :)我已經提供了CustomerAssembler的構造函數。由於泛型被使用,我需要動態地創建這個類的一個實例。我已經包含了我正在使用的代碼片段。其中,我調用getConstructors()來查看構造函數是否存在以及它們的簽名。這兩個構造函數都存在,而且我使用了正確的簽名,所以我不知道爲什麼我一直在收到這個異常。 Arggg ...希望你會看到我做錯了什麼。 :)使用getConstructor()在運行時創建Generic類的實例:NoSuchMethodException()
謝謝您的時間和幫助, 邁克
// Here are the constructors for CustomerAssembler.
public CustomerAssembler()
{
super();
}
public CustomerAssembler(
Class<Customer> entityClass,
Class<CustomerPreviewDTO> entityPreviewDTOClass,
Class<CustomerDetailDTO> entityDetailDTOClass,
Class<CustomerUpdateDTO> entityUpdateDTOClass,
EntityManager entityManager)
{
super(entityClass, entityPreviewDTOClass, entityDetailDTOClass, entityUpdateDTOClass, entityManager);
}
這裏是個例外:NoSuchMethodException:
java.lang.NoSuchMethodException: assemblers.CustomerAssembler.<init>(entities.Customer, dtos.CustomerPreviewDTO, dtos.CustomerDetailDTO, dtos.CustomerUpdateDTO, javax.persistence.EntityManager)
這裏是代碼...
try
{
Class<CustomerAssembler> customerAssemblerClass = CustomerAssembler.class;
Constructor<CustomerAssembler>[] lst = (Constructor<CustomerAssembler>[]) this.customerAssemblerClass.getConstructors();
/* See what the signature is for the non-default constructor, so I can make sure that
getConstructor() is configured properly. Here is what was reported in the debugger:
[0] = {[email protected]}"public assemblers.CustomerAssembler()"
[1] = {[email protected]}"public assemblers.CustomerAssembler(java.lang.Class,java.lang.Class,java.lang.Class,java.lang.Class,javax.persistence.EntityManager)"
signature = {[email protected]}"(Ljava/lang/Class<Lentities/Customer;>
Ljava/lang/Class<dtos/CustomerPreviewDTO;>
Ljava/lang/Class<dtos/CustomerDetailDTO;>
Ljava/lang/Class<dtos/CustomerUpdateDTO;>
Ljavax/persistence/EntityManager;)V"
*/
// Configure our constructor call... this.contactAssemblerClass
Constructor<CustomerAssembler> ca =
customerAssemblerClass.getConstructor(
Customer.class,
CustomerPreviewDTO.class,
CustomerDetailDTO.class,
CustomerUpdateDTO.class,
EntityManager.class);
// Create an instance here...
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
啊!謝謝,JB!我應該從異常信息中意識到我的錯誤!我已將代碼更改爲您推薦的簽名,現在它找到了構造函數! :)我不確定在做出這個改變後詢問後續問題是否合適,或者我是否應該提出一個新問題......我會問,但如果不合適,請讓我知道,並且我將打開一個新的。得到構造函數之後,我需要創建一個實例,所以我完成了以下操作,但是它失敗了,出現IllegalArgumentException:參數類型不匹配。 – 2014-10-08 04:39:44
我傳遞了所需的類,所以我不確定是什麼錯。我會很感激你的評論。再次感謝您的迴應! this.contactAssembler = ca.newInstance( Customer.class, CustomerPreviewDTO.class, CustomerDetailDTO.class, CustomerUpdateDTO.class, EntityManager.class); – 2014-10-08 04:40:48
您的構造函數將4個類作爲參數:Customer.class,CustomerPreviewDTO.class,CustomerDetailDTO.class,CustomerUpdateDTO.class。但最後一個參數不是一個類。它是EntityManager的*實例*。 – 2014-10-08 05:50:03