Java API для получения метаданных об исходном коде Java - PullRequest
3 голосов
/ 21 марта 2011

Я хотел бы создать несколько документов обратного проектирования, основанных на коде 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 голосов
/ 21 марта 2011

Существует несколько таких API (которые поставляются с JDK), некоторые из них встроены в Java Compiler (javac).

  • Наиболее обширный API дерева компиляторов , который дает вам доступ к отдельным выражениям (и подвыражениям) в исходном коде Java.
  • API-модель языковой модели моделирует типы и члены типов (конструкторы, методы, поля) - используется API дерева компилятора, а также для обработки аннотаций.Он не дает доступа к содержимому методов.
  • Конечно, во время выполнения у вас есть Reflection API (java.lang.Class и java.lang.reflect.* вместе с java.lang.annotation).
  • Чтобы использовать API дерева компилятора, вы должны вызвать компилятор с * 10120 * API компилятора .
  • . Кроме того, для Javadoc есть Doclet API , который дает вампохожий вид API языковой модели, но дополнительно с комментариями к документации (и анализируемыми тегами).

Однажды я использовал комбинацию API Doclet и API дерева компиляторов для красивого форматирования исходного кода (этоне в сети, к сожалению).

2 голосов
/ 21 марта 2011

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 .

0 голосов
/ 22 марта 2011
0 голосов
/ 21 марта 2011

Мне кажется ANTLR - это один из вариантов, но я не использовал его

...