Java:从字符串初始化类
假设我有一个名为ModelX的类,但我的程序直到运行时才知道这个类 因此,要创建它,我不能:Java:从字符串初始化类,java,reflection,constructor,Java,Reflection,Constructor,假设我有一个名为ModelX的类,但我的程序直到运行时才知道这个类 因此,要创建它,我不能: private ModelX aModel; 因为它还不知道它的名字或者它的存在,所以它所做的唯一一件事就是从一个简单的.txt文件中读取它的名字 如何使它从字符串加载类,然后获取其构造函数,以便 String x = "ModelX"; cls = Class.forName("x"); Object obj = cls.newInstance(); aModel = new obj(); an
private ModelX aModel;
因为它还不知道它的名字或者它的存在,所以它所做的唯一一件事就是从一个简单的.txt文件中读取它的名字
如何使它从字符串加载类,然后获取其构造函数,以便
String x = "ModelX";
cls = Class.forName("x");
Object obj = cls.newInstance();
aModel = new obj();
and
private obj aModel;
比如说,这样我就可以做到
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时。首先,
Class.forName()
方法需要完全限定的类名。是类的简单名称,例如ModelX
,附加到其包名之后,例如用
分隔
package com.example;
public class ModelX {...}
你会把它当作
Class clazz = Class.forName("com.example.ModelX");
其次,类class
有一些方法来获取构造函数
实例。如果您的ModelX
类有一个可访问的no-args构造函数,您可以直接用
Object instance = clazz.newInstance();
你需要适当地施法 Java不允许您引用编译时未知的类型。因此,不可能写入
private ModelX aModel;
如果ModelX
,则仅在运行时才知道
您有几种解决方法:
- 您可以在相同的包中定义自己的
,该包具有所有相同的方法和接口,但具有纯存根实现。您可以安排在运行时引入真正的实现(例如,通过将存根编译成一个ModelX
文件,该文件不会包含在最终的.class
中)。这就是Android所做的,例如,为Eclipse提供可浏览的Android类,这些类实际上只在设备上实现.jar
- 您可以定义一个名为类似的代理类(例如,
),该类实现所有相同的方法,通过反射将它们转发到运行时加载的类ModelProxy
- 反射可按如下方式使用:
String x = "com.example.ModelX";
Class cls = Class.forName(x);
Object obj = cls.newInstance();
这可能也有帮助: