2012-08-02 102 views
1

我的应用程序允许开发人员创建一些插件。根据基本抽象类确定的要求。每个插件必须有一个名称。我想通过使用注释来解决这个问题。所以,我定义我自己的批注名称如下:反射读取命名类的注释

@Retention(RetentionPolicy.RUNTIME) 
public @interface Name { 
public String value(); 
} 

我把这个annotaion和基础抽象类CommonPlugin成单独的模块,并打造为JAR文件与开发商分享。

然后我导入包,并把这个注释我的defenition之前测试插件如下:

@Name("Test plugin") 
public class TestPlugin extends CommonPlugin { 

然后我反映过URLClassLoader所有给出的插件并不能找到在TestPlugin类注释必要。但是如果我将Name注释定义到TestPlugin类的相同包中,我可以找到它。它应该是这样还是我做错了什么?

+0

这听起来不像它应该是这样。您的软件包和导入是否以这样一种方式设置,即未经认证的名称“Name”在所有来源中指的是相同的合格名称?您可以使用'javap'来查看类中存储了哪些注释,以查看问题出在创建还是加载该'TestPlugin'类。 – MvG 2012-08-02 10:30:45

+1

是的,我已将注释名称更改为PluginName,问题已解决。可能,名称'名字'不是最好的选择。谢谢。 – Zharro 2012-08-02 11:25:00

回答

1

把我的意见转化为答案,以便接受。

请确保非限定名称Name在所有源文件中引用相同的限定名称。在来自包含注释的包的源文件中的源文件中,应该有一个非通配符导入,用于Name,并且在该另一个包本身中不应该有该名称的类。