2

Как мы знаем, мы можем получить абстрактное синтаксическое дерево из исходных кодов, с помощью таких инструментов, какВ Java, как получить абстрактное дерево синтаксиса из файлов классов?

org.eclipse.jdt.astview 

Но учитывая скомпилированные файлы классов, как получить ASTS? Есть ли существующие инструменты? Can soot сделайте это?

Спасибо!

ответ

0

Декомпилировать и сделать то же самое.

Bytecode не имеет S, байткод - это результат преобразования AST-to-bytecode.

4

Но учитывая скомпилированные файлы классов, как получить АСТ?

Вы не можете. Технически невозможно восстановить AST для исходного исходного кода из файла «.class». Большая часть необходимой информации больше не присутствует в какой-либо форме, и другая информация была необратимо преобразована.

Есть ли существующие инструменты?

No.

Стандарт «ответ», чтобы использовать декомпилятор, но:

  • декомпилятор не может восстановить исходный AST (см выше)
  • выход декомпилятор часто даже не отдаленно напоминает исходный код
  • часто декомпилированный код даже не компилируется.
+1

Я бы добавил, что есть инструменты, которые позволяют вам просматривать структуру класса. Любая формальная спецификация, включая класс Java, может быть интернализирована как некоторая форма «AST», хотя интернализация файла класса будет заметно отличаться от интернализации исходного файла. –

+0

@ NathanD.Ryan Ваша точка интересна.не могли бы вы назвать некоторые имена инструментов для просмотра структуры файла classfile. – JackWM

+0

@JackWM: ASM (http://asm.ow2.org/) и BCEL (http://commons.apache.org/bcel/) - это те, которые сразу приходят в голову. Существуют и другие, менее известные, некоторые из которых реализованы только наполовину. –

0

Как насчет для данных файлов классов, мы сначала декомпилировать его, используя инструмент, как JAD, то мы могли бы получить «исходный код».

Несмотря на то, что этот «исходный код» из декомпиляции не совпадает с исходным, он разделяет ту же семантику. Ниже приведен простой тест.

Оригинал ява файл:

package shape.circle; 
public class Circle 
{ int r; // this is radius of a circle 
    public Circle(int r) 
    { this.r = r; 
    } 

    /* get the diameter 
     of this circle 
    */ 
    public int getDiameter() 
    { 
     if(r==0) 
     { System.out.println("r is 0"); 
      return -1; 
     } 
     else 
     { int d = multiply(2,r); 
      return d; 
     } 
    } 

    int multiply(int a, int b) 
    { int c; 
     c = a * b; 
     return c; 
    } 
} 

Ниже декомпилированный ява файл из Circle.class.

package shape.circle; 
import java.io.PrintStream; 
public class Circle 
{ 

    public Circle(int i) 
    { r = i; 
    } 

    public int getDiameter() 
    { if(r == 0) 
     { System.out.println("r is 0"); 
      return -1; 
     } else 
     { 
      int i = multiply(2, r); 
      return i; 
     } 
    } 

    int multiply(int i, int j) 
    { 
     int k = i * j; 
     return k; 
    } 

    int r; 
} 

Они почти такие же. Затем, как и прежде, мы можем использовать инструмент для исходного кода

org.eclipse.jdt.astview 

для получения АСТ.

Смежные вопросы