Как насчет для данных файлов классов, мы сначала декомпилировать его, используя инструмент, как 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
для получения АСТ.
Я бы добавил, что есть инструменты, которые позволяют вам просматривать структуру класса. Любая формальная спецификация, включая класс Java, может быть интернализирована как некоторая форма «AST», хотя интернализация файла класса будет заметно отличаться от интернализации исходного файла. –
@ NathanD.Ryan Ваша точка интересна.не могли бы вы назвать некоторые имена инструментов для просмотра структуры файла classfile. – JackWM
@JackWM: ASM (http://asm.ow2.org/) и BCEL (http://commons.apache.org/bcel/) - это те, которые сразу приходят в голову. Существуют и другие, менее известные, некоторые из которых реализованы только наполовину. –