正如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