Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射覆盖2+;2 = 5_Java_Scala_Reflection_Scala Java Interop - Fatal编程技术网

Java 使用反射覆盖2+;2 = 5

Java 使用反射覆盖2+;2 = 5,java,scala,reflection,scala-java-interop,Java,Scala,Reflection,Scala Java Interop,请容忍我,我知道这是一个奇怪的问题 我刚刚偶然发现了Java的反射库,特别是这段代码,它覆盖了2+2=5: import java.lang.reflect.Field; 公共班机{ 公共静态void main(字符串[]args)引发异常{ Class cache=Integer.Class.getDeclaredClasses()[0]; 字段c=cache.getDeclaredField(“cache”); c、 setAccessible(true); 整数[]数组=(整数[])c.g

请容忍我,我知道这是一个奇怪的问题

我刚刚偶然发现了Java的反射库,特别是这段代码,它覆盖了
2+2=5

import java.lang.reflect.Field;
公共班机{
公共静态void main(字符串[]args)引发异常{
Class cache=Integer.Class.getDeclaredClasses()[0];
字段c=cache.getDeclaredField(“cache”);
c、 setAccessible(true);
整数[]数组=(整数[])c.get(缓存);
数组[132]=数组[133];
System.out.printf(“%d”,2+2);
}
}
我试图通过将其转换为等效的Scala形式来了解它所做的工作,但它并没有编译为
Int.getClass.getDeclaredClasses
返回一个空数组:

import java.lang.reflect.Field
val缓存:类[]=Int.getClass.getDeclaredClasses.head
//上面一行在空迭代器上抛出java.util.NoSuchElementException:next
val c:Field=cache.getDeclaredField(“cache”)
c、 setAccessible(true)
val array=c.get(缓存).asInstanceOf[array[Int]]
数组(132)=5
println(2+2)
当我尝试使用
class
getClass
时,它们都不是
Integer
下的方法,因此我尝试使用
Int
;我的印象是Scala的
Int
只是Java的
Integer
的包装器-不是这样吗

我也尝试过:

  • newinteger()
    (抱怨“重载了方法构造函数Integer和其他方法”)
  • newint()
    (“类Int是抽象的;不能实例化”)
  • 类T扩展Int和Integer扩展Int。。。新的T.getClass…
    (从最终类非法继承)

为什么在不使用Scala编译的Java中可以实现这一点?我如何在Scala中实现我愚蠢的
2+2=5
目标?

如果您在
Integer
类中选中
IntegerCache
内部类。实施的部分内容如下:

        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
而你的数组[132]=数组[133];表达式使缓存中的4=5。因此,每当应用程序从缓存调用索引4时,将返回整数5


对于Scala部分,我没有Scala方面的经验,但它不是使用JVM将自己编译成字节码吗?因此,Scala可能没有使用JDK,并且它的Int实现不同,这就是您得到错误的原因(根据@Dmytro Mitin的回答,似乎可以使用JDK中的整数)

java.lang.Integer
应该代替
Scala.Int

Int.getClass
是在类
Int
的伴生对象上调用的
getClass
,这是错误的

将代码翻译成Scala是非常困难的

val cache=classOf[Integer]。getDeclaredClasses.apply(0)
val c=cache.getDeclaredField(“缓存”)
c、 setAccessible(true)
val array=c.get(缓存).asInstanceOf[array[Integer]]
数组(132)=数组(133)
println(2+2)//5
我的印象是Scala的
Int
只是Java的
Integer
的包装器-不是这样吗

不是。通常,
scala.Int
对应于Java
Int


相关(可能重复):@VGR链接良好。可能不是重复,因为问题是如何在Scala中复制。@VGR正如Dmytro所说,它并没有回答我的问题,因为我对这个Java代码的Scala翻译特别感兴趣,但不管怎样,对引擎盖下发生的事情的解释是非常有帮助的。感谢您提供的信息链接!
0 -> 128
1 -> 129
2 -> 130
3 -> 131
4 -> 132
5 -> 133