Java获取Java源代码元数据的API

3
我希望能够基于Java代码(而不是字节码)创建一些反向工程设计文档,但我不想编写自己的解释器。有哪些工具和API可用于使用Java代码遍历Java代码?
反射是基于字节码的,并且仅限于方法级别,我想将方法代码“对象化”。
Java文档忽略了代码本身,只基于注释,自动UML序列过于严格。
例如,像这样的API(请原谅我对官方编程语言结构术语的无知):
JavaCodeDom jcd = new JavaCodeDom(new File(pathToJavaSource), CompilerEnum.Java16)
List <ClassSrc> classes = jcd.getClasses();
ClassSrc cls = classes.get(0);
Map<MethodSignatureSrc,MethodSrc> methods = cls.getMethodsMap();
MethodSrc main = mothds.get(new MethodSignatureSrc(Modifiers.Public, Modifiers.Static, ReturnTypes.Void, "main", new MethodParams(String[].class))
List<StatementSrc> statements = main.getStatements();
for(StatementSrc statement : statements){
   if(statement.getType()==StatementTypes.Assignment()){
        AssignmentStatementSrc assignment = (AssignmentStatementSrc)statement;
        Identifier src = assignment.getAssigneeVariable();
        ExpressinoSrc = assignment.getAssignmentValue();
   }
}
List<AnnotationsSrc> annotations = cls.getAnnotations();
4个回答

3

现有几种这样的API(并且随JDK一起提供),其中一些是构建在Java编译器(javac)中的。

  • 最全面的是编译器树 API,它可以让您访问 Java 源代码中的单个表达式(和子表达式)。
  • 语言模型 API 模拟类型和类型成员(构造函数、方法、字段)- 它被编译器树 API 使用,也用于注释处理。它不提供对方法内容的访问。
  • 当然,在运行时,您有反射 API(java.lang.Classjava.lang.reflect.*,以及 java.lang.annotation)。
  • 要使用编译器树 API,您必须调用编译器,使用 编译器 API
  • 此外,还有适用于 Javadoc 的 Doclet API,它为您提供了与语言模型 API 类似的视图,但还包括文档注释(和解析标记)。

我曾经使用Doclet API和Compiler Tree API的组合来美化源代码格式(可惜这不是在线的)。


谢谢,现在我只需要知道如何使用它 ;) 请查看我的后续问题:https://dev59.com/E1XTa4cB1Zd3GeqP1WmB - Eran Medan
我会检查一下我的文档生成器,看看它是否可以发布...但现在不行,我本来几个小时前就应该睡觉了。 - Paŭlo Ebermann

2
BCEL支持读取和操作Java类文件。(我自己没有使用过它,但在第三方产品中看到了成功的使用。)
    The Byte Code Engineering Library is intended to give users a convenient
    possibility to analyze, create, and manipulate (binary) Java class files
    (those ending with .class). Classes are represented by objects which 
    contain all the symbolic information of the given class: methods, 
    fields and byte code instructions, in particular. 

如果您只是想反编译,那么将其反编译为源代码可能已经足够了。这里提供了一个Java的几个选项进行比较

谢谢,但我对源代码信息感兴趣,而不是编译后的类。 - Eran Medan

0

我觉得ANTLR是一个选项,但我还没有使用过它。


ANTLR可以解析Java源代码。看起来海报想要遍历已编译的类。 - Andy Thomas
@Andy - 谢谢,我是作者(回答了自己的问题),但我确实想遍历源码而不是已编译的类。 - Eran Medan
哦!我实际上已经使用过ANTLR。我找到了一个现有的Java语法,但不记得支持哪个版本的Java语言,并且Java 7正在发生变化。您可能可以将其用作起点,并添加自己的操作。我推荐ANTLR作者的书《The Definitive Antlr Reference: Building Domain-Specific Languages》。 - Andy Thomas

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接