Java 使用反射覆盖2+;2 = 5
请容忍我,我知道这是一个奇怪的问题 我刚刚偶然发现了Java的反射库,特别是这段代码,它覆盖了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
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
的包装器-不是这样吗
我也尝试过:
(抱怨“重载了方法构造函数Integer和其他方法”)newinteger()
(“类Int是抽象的;不能实例化”)newint()
- 用
(从最终类非法继承)类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
对应于JavaInt
相关(可能重复):@VGR链接良好。可能不是重复,因为问题是如何在Scala中复制。@VGR正如Dmytro所说,它并没有回答我的问题,因为我对这个Java代码的Scala翻译特别感兴趣,但不管怎样,对引擎盖下发生的事情的解释是非常有帮助的。感谢您提供的信息链接!
0 -> 128
1 -> 129
2 -> 130
3 -> 131
4 -> 132
5 -> 133