4

次の定義があるとします。

public class Test {

    public static void main(String[] args) {
        System.out.println("------MAIN METHOD------");
        A a = new B();  
        a.a = 3;
        System.out.println(a.a);
    }

}

    public class A {

        int a;

        public void g(){
            System.out.println(a);
        }

    }

public class B extends A {}

ここで、上記をビルドしてから B を次のように変更するとします。

public class B {}

ベリファイアをオフにすると、メソッドは 3! を出力します。私は検証者がこれをキャッチしないことを理解しています.解決はAでフィールドaがあることをチェックします.これはケースです...しかし、Bは整数フィールドaにスペースを割り当てていません! じゃあどこに書くの?

4

2 に答える 2

4

メモリ内の Java オブジェクトは、少なくとも 16 バイトの長さになるようにパディングされて配置されるため、int フィールドのみを含むクラスには、未使用のスペースがいくつかあります。A にさ​​らにいくつかのフィールドを追加すると、おそらく他のオブジェクトのストレージ スペースが上書きされますが、特にすぐに終了するような短いアプリケーションでは、すぐにクラッシュすることはありません。

次のようにクラスを宣言することで、さらに楽しむことができます。

public class A {
    int[] a = new int[1];
}

public class B {
    int a = 0x01020304;
}

public class Test {
    public static void main(String[] args) {
        A a = new B();  
        a.a[0] = 3;
        System.out.println(a.a[0]);
    }
}

このコードを介して実行しjava -Xverify:none Testた結果、次のような JVM エラーが発生するはずですが、原則として、Java プロセスのメモリのどこにでも書き込むことができます。

------MAIN METHOD------
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f9147d69532, pid=14785, tid=140262017775360
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# j  Test.main([Ljava/lang/String;)V+17
于 2012-05-12T17:48:50.493 に答える
0

本当に B のみを再構築した場合、 B は A とのランタイム互換性がなくなるため、A a = new B();a で失敗するはずです。再構築された B がランタイム クラスパスにあり、それが唯一の B であることを確認してください。ClassCastException

訂正:VerifyErrorではなくClassCastException.

元のコードをコンパイルして実行します: C:\TMP>%JAVA_HOME%\bin\javac -s 。*.java C:\TMP>%JAVA_HOME%\bin\java -cp . テスト ------主な方法------ 3

次に、B.java を更新し、再コンパイルして、再度実行します: C:\TMP>%JAVA_HOME%\bin\javac -s 。B.java C:\TMP>%JAVA_HOME%\bin\java -cp . スレッド「メイン」でのテスト例外 java.lang.VerifyError: オフセット 18 のメソッド Test.main([Ljava/lang/String;)V の putfield のオペランド スタックの型が正しくありません

于 2012-05-12T15:41:09.200 に答える