【问题标题】:How can I instantiate a class with it's String Name? [duplicate]如何用它的字符串名称实例化一个类? [复制]
【发布时间】:2014-07-17 21:27:08
【问题描述】:

我有一个类名数组:

String[] myClasses = { "Hello", "World" };

有没有办法用字符串名称实例化一个类? 例如:

public SomeClassType getMyClass(String className) {
  ???
}

getMyClass("Hello"); // returns an instance of the Hello class
getMyClass("World"); // returns an instance of the World class

ps:显然没有遍历所有字符串。

ps:Hello 和 World 都继承了 SomeClassType

【问题讨论】:

标签: java


【解决方案1】:

查看 Java 反射教程 (http://docs.oracle.com/javase/tutorial/reflect/class/index.html)。这是一个例子:

public class Hello {

    public void foo() {
        System.out.println("Inside Hello foo()...");
    }

    public static void main(String[] args) {
        Class<?> c;
        try {
            c = Class.forName("Hello");
            Hello h = (Hello) c.newInstance();
            h.foo();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}

【讨论】:

    【解决方案2】:

    您可以使用Class#forName 获取Class type,然后使用clazz.newInstance() 获取该类的实例。

    问题是你需要完整的限定名(类名和包名),如果你没有全名,你可以使用Reflection来迭代包并获得你想要的类。

    您可以看到一个工作示例here

    【讨论】:

      【解决方案3】:

      Java Reflection API:

      String className = "MyClass";
      Class<?> myClass = Class.forName(className);
      MyClass ob = (MyClass) myClass.newInstance();
      

      【讨论】:

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