2013-08-27 56 views
1

我想创建一个方法,它将基于给定的接口实例化一个类。目前我正在尝试基于类名来实例化一个类,但我一直在收到ClassNotFoundException用反射在Java中实例化一个类

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

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类是在一个名为“工程”项目和一个包叫做MyExample

+0

你确定类'Message'在类路径上吗?另外,您需要完整的类名称; 'com.whatever.Message' – raffian

+0

你的包裹是什么?你的'Message.class'居住在哪里? – user902383

+0

类是Message还是普通类中的主要方法?如果是这样,请看看这里:http://stackoverflow.com/questions/2097982/is-it-possible-to-create-an-instance-of-nested-class-using-java-reflection –

回答

4

你需要指定完全合格的类名Class.forName(String)

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

如果Message在包com.package中,那将是com.package.Message

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

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

2

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

0

您需要提供该类的标准名称。如果Message在包x.y那么你必须提供x.y.Message

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

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

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

结构应该是这样的:

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

在这种情况下,你应该能够说

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

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