0

ObjectWeb の ASMifier を使用して「HelloDump.java」を取得し、クラスローダーとメイン メソッドを追加して、スプーフィングされた「HelloWorld」をロードして実行しました。

ビルド ツール sbt で「HelloDump.java」を実行すると、すべて正常に動作し、「HelloWorld!」が出力されます。

しかし、生のJavaを使用すると壊れます。「HelloDump.java」は正常にコンパイルされているようですが、結果の「HelloDump.class」は明らかに存在しますが、認識されていないようです (以下のシーケンスを確認してください)。

$ julianpeeters@julianpeeters-virtual-machine ~/asm-example $ javac -cp lib/asm-all-4.1.jar HelloDump.java

$ julianpeeters@julianpeeters-virtual-machine ~/asm-example $ ls
DumpLoader.java.bak  HelloDump.class.bak                 Hello.java.bak
Hello.class.bak      HelloDump$DynamicClassLoader.class  lib
HelloDump.class      HelloDump.java                      README.md

$ julianpeeters@julianpeeters-virtual-machine ~/asm-example $ java -cp lib/asm/all/4.1.jar HelloDump
Exception in thread "main" java.lang.NoClassDefFoundError: HelloDump
Caused by: java.lang.ClassNotFoundException: HelloDump
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: HelloDump. Program will exit.

クラスパスに明示的に追加.しても役に立ちません。

では、これが sbt では機能するのに、生の Java では機能しないのはなぜですか? どうすれば修正できますか?

ありがとう、アドバイスをいただければ幸いです - ジュリアン

4

1 に答える 1

3

.CLASSPATH に 追加すると、コマンドは次のようになります。java -cp lib/asm-all-4.1.jar:. HelloDump

JVM がクラスを見つけられない理由は、JVM がクラスパスのみを検索し、それ以外の場所を検索しないためです。

于 2013-04-03T07:35:03.967 に答える