简体   繁体   中英

Instantiate generic type

I'm trying to instantiate a new object by Class clazz like this:

Code:

public class EntityType {
    private Map json = null;
    public EntityType(Map json){
        this.json = json;
    }
    public <T> T getAs(Class<T> clazz){
        final Class<T> clz = clazz;
        T obj = null;
        try {
            if (checkMap(json)){
                obj = clz.newInstance();
            }
        } catch (Exception e){
            if (e instanceof InstantiationException){
                e.printStackTrace();
            } else if (e instanceof IllegalAccessException){
                e.printStackTrace();
            } else {
                e.printStackTrace();
            }
        }
        return obj;
    }
}

This is how I use the code:

EntityType type = new EntityType(map); // map contains values 
User user = type.getAs(User.class);

java.lang.InstantiationException is thrown for the above code.

What could be wrong in my code?

Update:

    @Entity(name = "user")
    public class User { 
        @Id 
        private String id;
        @Column
        private String name;
        @Column
        private Long age;
        public User() {}
       // Setters and getter 
   }

Full stack trace:

java.lang.InstantiationException: org.goo.AnnotationTest$User
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:325)
    at org.goodb.client.Goo$EntityType.getAs(Goo.java:90)
    at org.goo.AnnotationTest.doTest(AnnotationTest.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

您可能在用户的类中没有默认构造函数

The exception stack trace says

java.lang.InstantiationException: org.goo.AnnotationTest$User

which suggests that User is a nested or inner class rather than a top-level one. Static nested classes behave like top-level ones but for non-static inner classes, every instance is associated with a particular instance of its containing class and the compiler adds an extra parameter to the front of the parameter list for every constructor to pass in the appropriate containing instance. What in the source code looks like

public User() {}

actually corresponds in the bytecode to something like

public User(AnnotationTest containingInstance) { this.container = containingInstance; }

(not with those parameter/field names but you get the idea). So your User class does not in fact have a no-argument constructor.

If you declared the User class as a top-level class or marked it static then it would work as you expect it to.

You have a generic method but you ain't passing it the type parameter. Try this:

 User user = type.<User>getAs(User.class);

If you share more code with us I can help you more. For example I'd like to see the full stack trace and the User class.

As per javadoc description :

 * @exception  InstantiationException
 *               if this {@code Class} represents an abstract class,
 *               an interface, an array class, a primitive type, or void;
 *               or if the class has no nullary constructor;
 *               or if the instantiation fails for some other reason.

I think you do not have "nullary constructor", or most likely said : default constructor.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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