【发布时间】:2020-09-04 21:32:42
【问题描述】:
请耐心等待,我知道这是一个奇怪的问题。
我刚刚偶然发现了 Java 的反射库,特别是来自 a video by Lex Fridman 的这段代码,它覆盖了 2 + 2 = 5:
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);
}
}
我试图通过将其转换为等效的 Scala 形式来理解它正在做什么,但它没有编译,因为 Int.getClass.getDeclaredClasses 返回一个空数组:
import java.lang.reflect.Field
val cache: Class[_] = Int.getClass.getDeclaredClasses.head
// above line throws java.util.NoSuchElementException: next on empty iterator
val c: Field = cache.getDeclaredField("cache")
c.setAccessible(true)
val array = c.get(cache).asInstanceOf[Array[Int]]
array(132) = 5
println(2+2)
当我尝试使用 Integer 时,class 和 getClass 都不是 Integer 下的方法,所以我尝试使用 Int 代替;我的印象是 Scala 的 Int 只是 Java 的 Integer 的包装器 - 不是这样吗?
我也试过了:
-
new Integer()(抱怨“重载的方法构造函数 Integer with Alternatives”) -
new Int()("Int 类是抽象的;不能被实例化") - 使用
class T extends Int ... new T.getClass....扩展 Int 和 Integer(从最终类非法继承)
为什么它可以在 Java 中工作,它不能用 Scala 编译?如何在 Scala 中实现 2 + 2 = 5 的愚蠢目标?
【问题讨论】:
-
@VGR 好链接。可能不是重复的,因为问题是如何在 Scala 中重现。
-
@VGR 正如 Dmytro 所说,它没有回答我的问题,因为我对这段 Java 代码的 Scala 翻译特别感兴趣,但是无论如何解释引擎盖下发生的事情都非常有帮助。感谢您提供信息丰富的链接!
标签: java scala reflection scala-java-interop