2014-09-27 56 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 
} 
相关问题