繁体   English   中英

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

[英]Create instance of Generic class at runtime with getConstructor(): NoSuchMethodException()

我正在使用泛型,并且需要在运行时创建泛型类的实例,因此我尝试使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM