正如Oracle Documentation说,你能做到这一点的方式如下:
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });
让我使用提供的这样一个很简单的例子:
假设我们有Main
我们需要instanciate的类是在相同的包。然后,我们可以执行如下操作:
,我们需要实例化类:
public class MyClass {
public int myInt;
public MyClass(Integer myInt){
this.myInt = myInt;
}
}
main
方法:
public static void main(String[] args) throws Exception {
//Class name must contain full-package path
// e.g. "full.pack.age.classname"
String className = Main.class.getPackage().getName() + ".MyClass";
Class<?> clazz = Class.forName(className);
//Class.getConstructor(Class<?> ... parameters) gives you a suitable constructor
//depends on the argument types you're going to pass to them.
Constructor<?> ctor = clazz.getConstructor(Integer.class);
//Object creation and constructor call
Object object = ctor.newInstance(new Object[] { 1 }); //1 is just myInt value passes to a contructor being invoked.
System.out.println(((MyClass) object).myInt); //Prints 1
}
这就是所谓的反射。 – 2014-09-27 05:37:24
但是,如果不使用适当的统一接口(或超类型,如果您仍然相信子类型/ LSP多态性),这不是很有用。否则,你只是得到一个真正蹩脚的对象 - 被用作“创造”类型,一个Object表达式本身必须使用更多的反射(而不是有趣)或* cast *以适当的类型(这主要回到原来的问题)。表达式的类型,包括变量,*必须*在编译期间被解析。泛型和接口可以提供帮助。 – user2864740 2014-09-27 05:39:44