Java:从字符串初始化类

时间:2013-09-29 18:06:01

标签: java reflection constructor

假设我有一个名为ModelX的类,但我的程序不知道这个类,直到运行时。

所以要创建它我不能这样做:

private ModelX aModel;

因为它还不知道它的名字或它的存在,它唯一能做的就是从一个简单的.txt文件中读出它的名字。

如何让它从字符串加载类,然后获取其构造函数,以便我可以

String x = "ModelX";
cls = Class.forName("x");
Object obj = cls.newInstance();

例如,我可以做

aModel = new obj();

and

private obj aModel;

如果描述含糊不清,我很抱歉,但我真的不知道如何描述我想要的内容。

我需要能够做到这一点:

aModel = new ModelX();
private ModelX aModel;

我从字符串中获取了ModelX。

3 个答案:

答案 0 :(得分:3)

首先,Class.forName()方法需要完全限定的类名。这是类简单名称,例如ModelX,附加到其包名称,以.分隔。例如

package com.example;

public class ModelX {...}

你会用它作为

Class clazz = Class.forName("com.example.ModelX");

其次,类Class有一些获取Constructor实例的方法。 You can see and read about those in the javadoc。如果您的ModelX类具有可访问的no-args构造函数,则可以使用

直接调用它
Object instance = clazz.newInstance();

你需要适当地施放它。

答案 1 :(得分:0)

Java不允许您引用在编译时不知道的类型。因此,无法编写

private ModelX aModel;

如果ModelX只在运行时知道。

你有几种解决方法:

  • 您可以在相同的包等中定义自己的ModelX,它具有所有相同的方法和接口,但具有纯粹的存根实现。您可以安排在运行时引入实际实现(例如,将您的存根编译为.class文件,该文件不会包含在最终.jar中。例如,这就是Android为Eclipse提供可浏览的Android类,它们实际上只在设备上实现。
  • 您可以定义一个类似命名的代理类(或者例如ModelProxy),它实现所有相同的方法,通过反射将它们转发到运行时加载的类。

答案 2 :(得分:0)

反射可以如下使用,

String x = "com.example.ModelX";
Class cls = Class.forName(x);
Object obj = cls.newInstance();