gpt4 book ai didi

java - 在运行时使用 getConstructor() 创建泛型类的实例 : NoSuchMethodException()

转载 作者:行者123 更新时间:2023-12-01 12:27:08 26 4
gpt4 key购买 nike

我正在使用泛型,并且需要在运行时创建泛型类的实例,因此我尝试使用 getConstructor()。不幸的是,尽管有正确的签名,我还是收到了 NoSuchMethodException,所以我不知道出了什么问题。我将感谢您的建议,以便我能够解决这个问题。 :) 我已经提供了 CustomerAssembler 的构造函数。由于使用了泛型,我需要动态创建此类的实例。我已经包含了我正在使用的代码片段。在其中,我调用 getConstructors() 来查看构造函数是否存在及其签名。两个构造函数都存在,并且我使用了正确的签名,所以我不知道为什么我不断收到此异常。 Arggg...希望您能看到我做错了什么。 :)

感谢您的时间和帮助,迈克

 // 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] = {java.lang.reflect.Constructor@10796}"public assemblers.CustomerAssembler()"

[1] = {java.lang.reflect.Constructor@10797}"public assemblers.CustomerAssembler(java.lang.Class,java.lang.Class,java.lang.Class,java.lang.Class,javax.persistence.EntityManager)"
signature = {java.lang.String@10802}"(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();
}

最佳答案

customerAssemblerClass.getConstructor(
Customer.class,
CustomerPreviewDTO.class,
CustomerDetailDTO.class,
CustomerUpdateDTO.class,
EntityManager.class);

这会查找具有以下签名的构造函数:

CustomerAssemble(Customer c,
CustomerPreviewDTO cpDTO,
CustomerDetailDTO cdDTO,
CustomerUpdateDTO cuDTO,
EntityManager em)

您的构造函数不将其作为参数。它需要 4 个 Class 实例和一个 EntityManager 实例。

所以代码应该是

customerAssemblerClass.getConstructor(
Class.class,
Class.class,
Class.class,
Class.class,
EntityManager.class);

关于java - 在运行时使用 getConstructor() 创建泛型类的实例 : NoSuchMethodException(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26242320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com