假设我有一个名为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。
答案 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();