Java反射:如何获取评论?

asp*_*sen -1 java reflection javaparser

我在 Java 解析方面遇到了一些困难。我需要以某种方式通过反射获取类、字段、方法等的注释。

我找到了JavaParser,它看起来可以引发注释,但我不知道如何做到这一点,因为所有示例都只是解析给定的字符串。我发现TypeSolver可以采用规范名称,但看起来它不能与注释一起使用。

我的问题是,如果我只有评论,Class<?>并且该项目还有其他一些jar's也应该反思的评论,那么如何找到评论。通过调试,我看到了原始源代码,看起来可以以某种方式完成。
谢谢。

PS我有源代码,我需要Class<?>与源代码匹配,然后通过JavaParser提取注释

Ste*_*n C 5

首先,你不能直接使用反射来获取注释,也不能通过使用读取“.class”文件的库来获取它们。该信息不存在于“.class”文件中,并且反射仅知道可从那里直接获得的信息。

正如人们所指出的,只有拥有源代码才能获得评论。如果您有源代码文件,您应该能够使用JavaParser或(可能)其他一些库提取注释,...或者通过编写自己的解析器。

问题将是从Class对象映射到相应的源代码文件。让我们假设您有多个源树对应于应用程序类路径上的多个 JAR。你会需要:

  • 类路径上每个 JAR 或目录的 URI,
  • 从每个 URI 到相应源树的映射。

方法是:

  1. 从对象中获取完全限定的类名Class
  2. 将类名映射到相对的 Java 源路径;例如foo.bar.Baz会变成foo/bar/Baz.java
  3. 用于clazz.getProtectionDomain().getCodeSource().getLocation().toURI()获取加载类的 URI。
  4. 使用您的映射将 URI 映射到相应的源树...
  5. 解析相对于源树根的相对路径。
  6. 打开源文件。

上述某些步骤可能会出现问题。例如:

  • 在第2步中,您需要处理嵌套类,
  • 在步骤 3 中,getCodeSource()可以返回null,
  • 在第 3 步中,结果URI可能有一个奇怪的协议,
  • 如果您的映射不完整,第 4 步可能会失败,
  • 如果您的源代码与您正在执行的代码不匹配,则第 5 步可能会失败。

打开源文件后,您可以Reader使用您选择的 Java 解析器构建并解析源代码。


如果您的项目是一个“绿色领域”项目,那么定义自定义注释类型(具有保留运行时)并将您的注释转换为注释可能会更简单。这些注释可以简单快速地提取,并且不会出现上述任何可能的故障模式。

但另一方面,与注释相比,注释(在源代码中)编写起来很麻烦。此外,您还会使用额外的注释来使“.class”文件变得臃肿。


我不知道如何做到这一点,因为所有 [JavaParser] 示例都只是解析给定的字符串。

javadoc显示您可以使用实例来解析 a 、 an a或 a 。JavaParserFileInputStreamReaderString