1

Say I have a class called ModelX, but my program doesn't know about this class untill runtime.

So to create it I can't do:

private ModelX aModel;

Because it doesn't know its name or its existance yet, the only thing it does do is read its name from say a simple .txt file.

How can I make it load the class from a string and then get its constructor, so that I can do

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

for example, so that I can do

aModel = new obj();

and

private obj aModel;

I'm sorry if the description is vague but I do not really know how to describe what I want.

I need to be able to do this:

aModel = new ModelX();
private ModelX aModel;

While I got ModelX from a string.

4

3 回答 3

3

首先,该Class.forName()方法需要完全限定的类名。是类的简单名称,例如ModelX,附加在其包名后面,用a分隔.例如

package com.example;

public class ModelX {...}

你会用它作为

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

其次,该类Class有一些获取Constructor实例的方法。您可以在 javadoc 中查看和阅读这些内容。如果你的ModelX类有一个可访问的无参数构造函数,你可以直接调用它

Object instance = clazz.newInstance();

你需要适当地投射它。

于 2013-09-29T18:08:13.863 回答
0

反射可以如下使用,

String x = "com.example.ModelX";
Class cls = Class.forName(x);
Object obj = cls.newInstance();
于 2013-09-29T18:16:03.943 回答
0

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

private ModelX aModel;

ifModelX只会在运行时知道。

你有几种方法可以解决这个问题:

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