ご存知のように、次のようなツールを使用して、ソースコードから抽象構文木を取得できます。
org.eclipse.jdt.astview
しかし、コンパイルされたクラスファイルを考えると、ASTを取得する方法は?既存のツールはありますか?すすはできますか?
ありがとう!
ご存知のように、次のようなツールを使用して、ソースコードから抽象構文木を取得できます。
org.eclipse.jdt.astview
しかし、コンパイルされたクラスファイルを考えると、ASTを取得する方法は?既存のツールはありますか?すすはできますか?
ありがとう!
しかし、コンパイルされたクラス ファイルが与えられた場合、AST を取得するにはどうすればよいでしょうか。
できません。「.class」ファイルから元のソース コードの AST を再構築することは技術的に不可能です。必要な情報の多くはもはやいかなる形でも存在せず、他の情報は不可逆的に変換されています.
既存のツールはありますか?
いいえ。
標準的な「答え」は、逆コンパイラを使用することですが、次のとおりです。
逆コンパイルして同じことをします。
バイトコードには S がありません。バイトコードはAST からバイトコードへの変換の結果です。
特定のクラスファイルについては、まず jad などのツールを使用して逆コンパイルしてから、「ソースコード」を取得できます。
この逆コンパイルの「ソース コード」は元のコードとまったく同じではありませんが、同じセマンティクスを共有しています。以下は簡単なテストです。
元の Java ファイル:
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から逆コンパイルされた Java ファイルです。
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
ASTを取得します。