1

rt.jar ライブラリから Java のjava.lang.Classクラスを逆コンパイルすると、ネイティブ メソッド宣言があることに気付くでしょう。

native ConstantPool getConstantPool();

少し前に、Sun の .class ファイル仕様を使用してクラスの逆コンパイルを行い、各 .class ファイルから定数プール レコードを取得することができました。しかし、それは実際にはクラスを逆コンパイルしていました。

ただ、Class クラスにこの署名があることに驚きました。そこで、Main() メソッドに小さなコードを書きました。

ConstantPool cp = new ConstantPool();
cp.getMethodAtIfLoaded(0);

sun.reflect.ConstantPoolクラスを逆コンパイルすると、クラス、メソッド、パラメータ、宣言されたフィールドなどに関連する多くのメソッドがあることがわかります。

アプリを実行すると、次の HotSpot 例外が発生します。

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d7e01d3, pid=2816, tid=5464
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_15-b04 mixed mode)
# Problematic frame:
# V  [jvm.dll+0xa01d3]
#
# An error report file with more information is saved as hs_err_pid2816.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

どのクラスのConstantPoolも取得できないのはなぜですか? getConstantPool()がネイティブ/非パブリック メソッドであるという事実を考慮すると、Sun は私が直接呼び出すことを望んでいないと思います。

4

1 に答える 1

1

sun.* の下のクラスは公開 API ではなく、予告なしに変更される可能性があり、あらゆる種類の機能を実行します。幸いなことに、信頼されていないコードはそれらにまったくアクセスできません。javac オブジェクトを使用できるようにします。

コードを逆コンパイルする必要はありません。必ずしも最新であるとは限りませんが、元のソースが利用可能です。

于 2008-12-22T23:28:36.543 に答える