首先,使用反射无法直接获取注释,也无法通过读取“.class”文件的库获取。信息不存在于“.class”文件中,反射只知道信息可以直接从那里获得。
正如人们所指出的,只有拥有源代码才能获得评论。如果你有一个源代码文件,你应该能够使用JavaParser
或(可能)其他一些库来提取注释,......或者通过编写你自己的解析器。
问题将是从Class
对象映射到相应的源代码文件。让我们假设您有多个源树对应于应用程序的类路径上的多个 JAR。你会需要:
- 类路径上每个 JAR 或目录的 URI,
- 从每个 URI 到相应源树的映射。
方法是:
Class
从对象中获取完全限定的类名。
- 将类名映射到相对 Java 源路径;例如
foo.bar.Baz
会变成foo/bar/Baz.java
- 用于
clazz.getProtectionDomain().getCodeSource().getLocation().toURI()
获取加载类的 URI。
- 将 URI 映射到相应的源代码树……使用您的映射。
- 解析相对于源树根的相对路径。
- 打开源文件。
上述某些步骤可能会出现问题。例如:
- 在第 2 步中,您需要处理嵌套类,
- 在第 3 步中,
getCodeSource()
可以返回null
,
- 在第 3 步中,结果
URI
可能有一个奇怪的协议,
- 如果您的映射不完整,第 4 步可能会失败,
- 如果您的源代码与您正在执行的代码不匹配,则第 5 步可能会失败。
打开源文件后,您就可以Reader
使用您选择的 Java 解析器构建并解析源代码。
如果您的项目是“绿地”项目,那么定义自定义注释类型(保留 == 运行时)并将您的注释转换为注释可能会更简单。这些注释可以简单快速地提取出来,没有上述可能的故障模式。
我不知道该怎么做,因为所有 [JavaParser] 示例都只是解析给定的字符串。
javadoc显示您可以使用JavaParser
实例来解析 a File
、 an InputStream
、 aReader
或 a String
。