使用反射在Java中实例化一个类

时间:2013-08-27 15:38:48

标签: java eclipse

我正在尝试创建一个基于给定接口实例化类的方法。目前我正在尝试基于类名实例化一个类,但我不断获得ClassNotFoundException

谁能告诉我我做错了什么?

public class Message implements IExample{
    @Override
    public String showMessage() {
        return "merge";
    }
}

public static void main(String[] args) throws Exception{
    Object mess = Class.forName("Message").newInstance();
}

修改

我试过了:

Object mess = Class.forName("com.MyExample.Message").newInstance();
Object mess = Class.forName("Project.MyExample.Message").newInstance();
Object mess = Class.forName("MyExample.Message").newInstance();

他们都抛出ClassNotFoundException和一个窗口,告诉我“找不到来源”的按钮(编辑源查找路径..)让我浏览文档。

主类和Message类都在一个名为“Project”的项目中,一个名为MyExample的包

4 个答案:

答案 0 :(得分:4)

您需要将完全限定的类名指定为Class.forName(String)

  

参数: className所需类的完全限定名称。

如果Message位于com.package包中,则为com.package.Message

Object mess = Class.forName("com.package.Message").newInstance();

启动应用程序时,该类必须位于类路径中。

答案 1 :(得分:2)

如果您的Message类在包中,则需要指定全名,例如edu.myschool.mypackage.Message

答案 2 :(得分:0)

您需要提供Class的完全限定名称。如果Message位于x.y包中,那么您必须提供x.y.Message

Object mess = Class.forName("x.y.Message").newInstance();

答案 3 :(得分:0)

类名不应包含ProjectName,只应包含src文件夹中定义的包名结构。

如果您使用的是Eclipse,请确保在项目中正确定义了src文件夹。 Here是如何更改应用的src文件夹(如果需要)。

结构应该是这样的:

Project
 |
 +-src
 | |
 | +-com
 |   |  
 |   +-MyExample
 |     |
 |     +-MyClass
 +-build

在这种情况下,您应该可以说

Class.forName("com.MyExample.MyClass").newInstance();

如何定义src文件夹中的结构并确保在IDE项目设置中定义了正确的src文件夹,这一点非常重要。