2013-09-29 33 views
1

假设我有一个名为ModelX的类,但是我的程序并不知道这个类直到运行时。Java:从一个字符串初始化一个类

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

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

首先,Class.forName()方法需要完全限定的类名称。该是类简单的名称,例如ModelX,附加到由.分离例如

package com.example; 

public class ModelX {...} 

其包名,你会用它作为

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

二,类Class具有AA几个方法得到Constructor实例。 You can see and read about those in the javadoc。如果您ModelX类有一个可访问的无参数的构造函数,你可以直接与

Object instance = clazz.newInstance(); 

称它为你需要适当地投放。

+0

这可能也有帮助:http://www.javapractices.com/topic/TopicAction.do?Id=113 –

0

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

private ModelX aModel; 

如果ModelX只会在运行时知道。

你必须围绕这几个方面:

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

反射可以如下使用,

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