Java如何重新定义基本int值

Java如何重新定义基本int值,java,Java,所以我知道在Java中重新定义一个基本的int是可能的,比如1=2,如果你做int x=1+2,那么x将等于4 有人知道这样做的语法吗?为了好玩,我决定尝试一下 很可能您听到的是,为了实现这一点,您可能会损坏整数的缓存 在进一步了解之前,以下是代码: package test; import java.lang.reflect.Field; public class BreakMath { public static void main(String[] args) throws

所以我知道在Java中重新定义一个基本的int是可能的,比如1=2,如果你做int x=1+2,那么x将等于4


有人知道这样做的语法吗?

为了好玩,我决定尝试一下

很可能您听到的是,为了实现这一点,您可能会损坏整数的缓存

在进一步了解之前,以下是代码:

package test;

import java.lang.reflect.Field;

public class BreakMath {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,
            IllegalArgumentException, IllegalAccessException {

        Class<?> integerCache = Class.forName("java.lang.Integer$IntegerCache");
        Field field = integerCache.getDeclaredField("cache");
        field.setAccessible(true);
        Integer[] cache = (Integer[]) field.get(null);
        cache[1 + 128] = 2;
        System.out.println(1 + 1);
        System.out.println(1 + Integer.valueOf(1));
        System.out.println(Integer.valueOf(1) + Integer.valueOf(1));
    }
}
到底发生了什么? 您没有更改Java中的1值。实际上,您正在利用Integer.class拥有的内部缓存(在Oracle的JVM和openJDK中,可能与其他供应商的JVM不同)

通过反射,我们到达整数缓存并更改值。从那时起Integer.valueOf()使用缓存,您可以实现这一点。。。但是如果你注意到,当你用纯原语做数学运算时,它就不起作用了。 如果您已经创建了新的整数(1)(因为它不使用缓存),那么它将无法正常工作

但是,在任何有JVM自动装箱的地方,您都会遇到这种情况。例如,如果你有这个方法

public static void printInteger(Integer i) {
        System.out.println(i);
 }
并称之为

printInteger(1)
自动装箱将发生,缓存将被使用,您将得到2个打印


注意默认情况下,该值在-128到128之间工作。这是默认缓存,但正如您在中所看到的,您可以使用-XX:AutoBoxCacheMax更改缓存大小。

在这种情况下,1+1将等于4。您能否向我们展示一些您希望/尝试实现这一点的代码?为什么你想成为1=2?你不喜欢数学定律吗?这在Java中是不可能的。给你看的人是在愚弄你。(或者你在跟踪我们…)可能是被黑客攻击的编译器或运行时?但是,语言规范中没有允许这样做的东西。我想您可以使用反射来更改与装箱的
整数
实例关联的值。但这对您展示的代码不起作用,因为它不使用拳击。我非常感谢您给出答案。这可能是我以前看到的,但即使不是,它也实现了我的期望。对发生的事情也有很好的解释,我不知道如何破坏缓存。@Elec0我还更新了另一个示例(调用一个方法,该方法将强制JVM将Primitive类型装箱到对象中)。这实际上只在默认情况下从-128到128(缓存大小)起作用。。还请记住,这可能会解开一个完全不一致的行为地狱:-)
printInteger(1)