2

ご存知のように、次のようなツールを使用して、ソースコードから抽象構文木を取得できます。

org.eclipse.jdt.astview

しかし、コンパイルされたクラスファイルを考えると、ASTを取得する方法は?既存のツールはありますか?すすはできますか?

ありがとう!

4

3 に答える 3

4

しかし、コンパイルされたクラス ファイルが与えられた場合、AST を取得するにはどうすればよいでしょうか。

できません。「.class」ファイルから元のソース コードの AST を再構築することは技術的に不可能です。必要な情報の多くはもはやいかなる形でも存在せず、他の情報は不可逆的に変換されています.

既存のツールはありますか?

いいえ。

標準的な「答え」は、逆コンパイラを使用することですが、次のとおりです。

  • 逆コンパイラは元の AST を再構築できません (上記を参照)。
  • 逆コンパイラの出力は、元のソース コードとほとんど似ていないことがよくあります。
  • 多くの場合、逆コンパイルされたコードはコンパイルさえしません。
于 2012-06-19T11:22:23.403 に答える
0

逆コンパイルして同じことをします。

バイトコードには S がありません。バイトコードはAST からバイトコードへの変換の結果です。

于 2012-06-19T11:20:01.050 に答える
0

特定のクラスファイルについては、まず 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を取得します。

于 2012-06-19T20:29:29.727 に答える