簡體   English   中英

用於獲取有關Java源代碼的元數據的Java API

[英]Java API to get metadata about Java Source Code

我想創建一些基於Java代碼(而不是字節碼)的反向設計文檔,而不是編寫自己的解釋器,使用Java代碼可以使用哪些工具和API來遍歷Java代碼?

反射是在字節碼上,並且僅限於方法級別,我想“客觀化”方法代碼。

Java doc忽略了代碼本身,並且僅基於注釋,自動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();

有幾個這樣的API存在(並隨JDK一起提供),其中一些在Java編譯器 (javac)中構建。

  • 最廣泛的是Compiler Tree API ,它使您可以訪問Java源代碼中的各個表達式(和子表達式)。
  • 語言模型API為類型和類型成員(構造函數,方法,字段)建模 - 它由編譯器樹API使用,也用於注釋處理。 它不提供對方法內容的訪問。
  • 當然,在運行時,您可以使用Reflection API( java.lang.Classjava.lang.reflect.* ,以及java.lang.annotation )。
  • 要使用編譯器樹API,必須使用編譯器API調用編譯
  • 此外,還有用於Javadoc的Doclet API ,它為您提供了類似於語言模型API的視圖,但還提供了文檔注釋(和解析的標記)。

我曾經使用Doclet API和編譯器樹API的組合來精美地格式化源代碼(這不是在線的,遺憾的是)。

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的幾個選項比較

我似乎ANTLR是一個選項,但我沒有使用它

這似乎回答了我的問題: 如何從Java源代碼生成AST? 勺子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM