どのようにプログラミングして2+2=5を実現しますか?


以下の内容は以下の通りになりますhttp://www.open-open.com/news/view/b70d9
-------------------------------------------
Write a program that makes 2+2=5、このテーマを見て、とても新鮮でした。一番目の答えはJavaで実現しました。Javaの全体的なインスタンスプールの概念を使用します。以前は例のプールしか見られませんでしたが、2つのオブジェクトのポインタが同じという問題があります。
Integer a = new Integer(2);

Integer b = new Integer(2);

System.out.print(a == b);
上のコードは最終的にtrueを出力します。Javaオブジェクトの申請原則から言えば、ここはfalseです。JVMが実現すると、デフォルトではIntegerオブジェクトのいくつかの例が生成されますので、必要な例が池に既に存在する数値である場合は、生成されたオブジェクトの参照を直接返します。新規にオブジェクトを作成する必要はありません。このようにして、実例の数とプログラムの動作性能を大幅に減らすことができます。
 
このテーマは池の中の対象の内容を修正し、最終的に取り返したインスタンスの値を変更しました。これは実は危険です。正式にプログラムを実行する前にこの修正をすれば、プログラム全体の運行ロジックが混乱します。
import java.lang.reflect.Field;



public class Main {

    public static void main(String[] args) throws Exception {

        Class cache = Integer.class.getDeclaredClasses()[0];

        Field c = cache.getDeclaredField("cache");

        c.setAccessible(true);

        Integer[] array = (Integer[]) c.get(cache);

        array[132] = array[133];



        System.out.printf("%d",2 + 2);

    }

}
上記は具体的なコードで、最終的な出力の結果は5です。
You need to change it even deeper than you can typically access. Note that this is designed for Java 6 with no funky parameters passed in on the JVM that would otherwise change the IntegerCache.

Deep within the Integer class is a Flyweight of Integers. This is an array of Integers from −128 to +127. cache[132] is the spot where 4 would normally be. Set it to 5.
キャッシュの読み書きインターフェースを利用して、4の例のキャッシュオブジェクトのポインタを5の対象に変更しました。このように、アプリケーションが4を取り出すと、実際には5の参照が返ってきます。印刷されたのは5です。