0

私はこの問題を何時間も見つめてきました。どんな助けでも大歓迎です。

「埋め込みjode jarファイル」からJode逆コンパイラを使用するコードを書きました。このバージョンは Lesser GNU Public License の下にあるため、使用したいと考えています。

Decompiler d = new Decompiler();
try {
    FileWriter fw = new FileWriter("c:\\jode.txt");

    d.setClassPath("C:\\mycode");

    ProgressListener p = new ProgressListener() {

        public void updateProgress(double arg0, String arg1) {
            System.out.println("inside of progress listener with arg0 = " +arg0+ " and arg1 = " +arg1);
        }
    };

    d.decompile("Test.class" , fw, p);

} catch (Exception ex) {
    ex.printStackTrace();
}

そして私はいつも得る:

Exception in thread "main" java.lang.NoClassDefFoundError: Test.class
        at jode.bytecode.ClassInfo.loadInfo(ClassInfo.java:620)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:86)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:123)
        at jode.decompiler.Decompiler.decompile(Decompiler.java:191)
        at testdecompiler.Main.main(Main.java:45)

私が使用する場合

jode.decompiler.Main.decompile(...)

動作しますが、このクラス ファイルは GPL のみの jode.jar にあるため使用できません。

4

4 に答える 4

1

私は、彼らの Web サイトから入手できる jode のさまざまなバイナリ バージョンのすべてで問題を再現することができました。svn のメインラインを使用して新しいバージョンの jode をビルドしたところ、問題なく動作しました。また、jode フォーラムの 1 つで、ユーザーが NoClassDefFound 問題について不満を述べているエントリを見ました。彼のケースは少し違うように聞こえましたが、jode 開発者は、ビルド前のバイナリの代わりに svn のメインラインを使用することを提案しました。

于 2009-10-15T01:49:12.983 に答える
0
d.setClassPath("C:\\mycode");

このクラスパスは私には非常に短いように見えます。

于 2009-10-10T21:42:22.110 に答える
0

更新: 私の最初の仮定は間違っていました。悪いことに、元の例外/メッセージは、ai が見る限り、破棄されています。JODE が失敗するコードは次のようになります。

 try {
      DataInputStream input = new DataInputStream
          (new BufferedInputStream
           (classpath.getFile(name.replace('.', '/') + ".class")));
        read(input, howMuch);            

  } catch (IOException ex) {
        String message = ex.getMessage();
      if ((howMuch & ~(FIELDS|METHODS|HIERARCHY
                       |INNERCLASSES|OUTERCLASSES)) != 0) {
          throw new NoClassDefFoundError(name);
        }

NoClassDefFound を取得するには IOException をスローする必要があるため、file.encoding などの IO サブシステムに関するすべてを確認してください。JODE にパッチを当てて、詳細なエラー メッセージを取得するか、この時点までデバッグする必要があると思います。

于 2009-10-10T22:12:42.827 に答える
0

クラスを逆コンパイルするのは好きではないので、これは推測ですが、使用する必要があると思います

d.decompile("Test" , fw, p);

あなたが今使っているものの代わりに。これは似ているかもしれません

Class.forName("ClassName")

「クラス」サフィックスなし。

于 2009-10-10T22:13:18.140 に答える