2014-09-27 75 views
-2

我想知道如何創建一個新的對象的某個類,如果我有該類名保存在一個字符串。創建一個給定類名稱作爲字符串類的對象

例如。我想創造FooClass的對象時,它會是這樣的:

String className = "FooClass"; 
className.toClass() newObject = new (className.toClass())(); 

我已經做了相當多的搜索,但一直無法找到答案。

感謝

+0

這就是所謂的反射。 – 2014-09-27 05:37:24

+0

但是,如果不使用適當的統一接口(或超類型,如果您仍然相信子類型/ LSP多態性),這不是很有用。否則,你只是得到一個真正蹩腳的對象 - 被用作「創造」類型,一個Object表達式本身必須使用更多的反射(而不是有趣)或* cast *以適當的類型(這主要回到原來的問題)。表達式的類型,包括變量,*必須*在編譯期間被解析。泛型和接口可以提供幫助。 – user2864740 2014-09-27 05:39:44

回答

2

正如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 
} 
相關問題