我对其他人建议的类路径扫描程序并不熟悉。他们看起来像一个强大的,如果不是理想的解决方案。
如果您可以控制源,那么您可以使用注释处理。
创建一个注释处理器,该注释处理器将创建一个具有静态成员Map<String,Foo>
的类 - MapClass
。注释处理器每次遇到@Name注释时,都会将其添加到源代码MapClass
。当它完成处理注释时,它将具有与硬编码地图相同的效果。
注释处理发生在编译期间。如果项目中的某些类不是由您编译的。例如,如果其他人编译一些类并给你一个罐子,那么它不会很容易工作。但是,如果所有的类都由您编译,那么它不应该是一个问题。
要创建注释处理器,请扩展AbstractProcessor
。您需要使用@ SupportedAnnotationTypes ("Name")
批注注释您的课程(确保名称是注释的完全限定名称。
覆盖process
方法。 process
有两个参数:annotations
和roundEnv
。 annotations
只是这个特定处理器支持的一组注释 - 在你的情况下它应该是(Name)。 roundEnv
是一个有用的工具类。
迭代annotations
中的一个注释。使用roundEnv
至getElementsAnnotatedWith
。这应该给你带有@Name
注释的所有元素的集合。
AbstractProcessor
还有另一个实用程序成员 - processingEnv
。使用其getFiler
方法createSourceFile
。
然后你必须稍微修改一下你的编译。您必须分别在其他课程之前编译处理器。在编译处理器并编译其他类之后,必须告诉编译器关于处理器的信息。如果您正在使用命令行,则可以添加-processorpath /path/to/processor/class[es]
和-processor qualified.name.of.processor
。
这种方法优于类路径扫描程序的优点是,所有事情都发生在编译时。例如,如果您不小心将一个@Name
注释添加到Bar
元素,则可以让处理器发出编译时错误(如果希望处理器可以忽略它)。然后你可以在产品发货前修好它。使用类路径扫描程序时,抛出的任何错误都是运行时错误 - 用户将看到。
这种方法的缺点是,一切都发生在编译时。这使得向项目动态添加类变得更加困难。
在java中?使用find + grep – ControlAltDel 2012-04-01 00:16:11
@ user1291492,使用unix cmd行应该非常容易,保留时间为RUNTIME。该方法可能会或可能不会访问源代码。 OTH,也许这个类文件是可以greppable的。 – emory 2012-04-01 05:18:15
稍有偏离主题,但你为什么要'Set'。有一个'Map '或名称的重点似乎更有意义。 –
emory
2012-04-01 05:20:49