根据类类型创建类实例?

时间:2014-03-07 08:13:33

标签: java java-7

我正在使用JAVA7。我在课堂下面。

public class SomeClass<B extends Base, L extends Last>{
   Class<L> last;
   Class<B> base;

   public SomeClass(Class<L> last, Class<B> base){
       this.last=last;
       this.base=base;
   }
}

这里我需要创建一个接受类类型并创建其实例并返回的方法。我怎么能这样做?

public returnclassinstance createInstance(Class class)

我会通过传递last / base来调用此方法。此方法必须创建传递的类类型的实例并返回相同的类型。有可能吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

要基于java Class类型创建新实例,您应该使用以下内容:

public <T> T createInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }

请注意T应该有公共默认构造函数。如果您想使用其他默认构造函数来创建Class的新实例,那么您应该考虑反思(例如clazz.getDeclaredConstructors())。

编辑:使用带参数的构造函数

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {
    public Test(String arg) {
        System.err.println("I'm in consturctor with one String arg: " + arg);
    }

    public static <T extends Test> T createInstance(Class<T> clazz) throws InstantiationException,
            IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Constructor<T>[] constructors = (Constructor<T>[]) clazz.getDeclaredConstructors();
        Constructor<T> constructor = constructors[0];
        return constructor.newInstance("ARG");
    }

    public static void main(String[] args) throws Exception {
        createInstance(Test.class);
    }
}

运行此代码后,您应该输出:

I'm in consturctor with one String arg: ARG

但请注意这段代码是多么丑陋 - 在我看来,使用Java中的反射创建这样的对象是最后一个选项(如果我们没有任何其他解决方案)。

相关问题