【问题标题】:Create an object of class with given a class name as a String [duplicate]使用给定的类名创建一个类对象作为字符串[重复]
【发布时间】:2014-11-22 04:14:25
【问题描述】:

我想知道如何创建某个类的新对象,如果我将该类名保存在字符串中。

例如。我想创建一个 FooClass 的对象会是这样的:

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

我已经做了很多搜索,但无法找到答案。

谢谢

【问题讨论】:

  • 这称为反射。
  • 但是,如果不使用适当的统一接口(或超类型,如果您仍然相信子类型/LSP 多态性),这并不是很有用。否则你只会得到一个玩起来真的很蹩脚的 Object - 要“用作”创建的类型,Object 表达式必须要么本身用于更多反射(不好玩),要么 cast 到适当的类型(这在很大程度上可以追溯到原始问题)。表达式类型(包括变量)必须在编译期间解析。泛型和接口可以提供帮助。

标签: java class reflection


【解决方案1】:

正如Oracle Documentation 中所说,您可以通过以下方式进行操作:

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

让我提供一个非常简单的使用示例:

假设我们有 Main 类和我们需要实例化的类在同一个包中。那么我们可以这样操作:

我们需要实例化的类:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多