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

获取Java源代码元数据的Java API,java,programming-languages,reverse-engineering,Java,Programming Languages,Reverse Engineering,我想基于Java代码(不是字节码)创建一些反向注册的设计文档,而不是编写我自己的解释器,有哪些工具和API可以使用Java代码遍历Java代码 反射在字节码上,并且仅限于方法级别,我还想“对象化”方法代码 Java文档忽略了代码本身,并且只基于注释,自动的UML sequencs太严格了 例如,这样的API(请原谅我对官方编程语言结构术语的无知): javacodedomjcd=newjavacodedom(新文件(pathToJavaSource),CompilerEnum.Java16) L

我想基于Java代码(不是字节码)创建一些反向注册的设计文档,而不是编写我自己的解释器,有哪些工具和API可以使用Java代码遍历Java代码

反射在字节码上,并且仅限于方法级别,我还想“对象化”方法代码

Java文档忽略了代码本身,并且只基于注释,自动的UML sequencs太严格了

例如,这样的API(请原谅我对官方编程语言结构术语的无知):

javacodedomjcd=newjavacodedom(新文件(pathToJavaSource),CompilerEnum.Java16)
List classes=jcd.getClasses();
ClassSrc cls=classes.get(0);
Map methods=cls.getMethodsMap();
MethodSrc main=mothds.get(新的MethodSignatureSrc(Modifiers.Public,Modifiers.Static,ReturnTypes.Void,“main”,新的MethodParams(String[].class))
List statements=main.getStatements();
for(语句src语句:语句){
if(statement.getType()==StatementTypes.Assignment()){
AssignmentStatementSrc assignment=(AssignmentStatementSrc)语句;
标识符src=assignment.getAssigneeVariable();
ExpressinoSrc=assignment.getAssignmentValue();
}
}
List annotations=cls.getAnnotations();
我似乎是一种选择,但我没有使用它。

支持读取操作Java类文件。(我自己没有使用过它,但看到它在第三方产品中成功使用。)


如果您只是对反编译感兴趣,您可能会发现反编译到源代码就足够了

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

我曾经使用Doclet API和编译器树API的组合来完美地格式化源代码(遗憾的是,这不是在线的)。

这似乎回答了我的问题:()

ANTLR可以解析Java源代码。看起来海报想要遍历编译过的类。@Andy-谢谢,我是作者(回答了我自己的问题)但我确实希望遍历源代码而不是编译类!我实际上使用过ANTLR。我遇到过一个现有的Java语法,但不记得支持哪一版本的Java语言,Java 7正在进行更改。您可以将其作为起点,并添加自己的操作。我推荐ANTLR作者的书,“权威的Antlr参考:构建领域特定的语言。”谢谢,但我对源代码信息感兴趣,而不是编译类Hanks,现在我只需要知道如何使用它;)在这里看到我的后续问题:我将查看我的Doclet,看看它是否处于要发布的状态……但不是现在,我应该在几个小时前就睡觉了。
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();
    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.