gpt4 book ai didi

java - 使用反射覆盖 2 + 2 = 5

转载 作者:行者123 更新时间:2023-12-02 16:29:40 26 4
gpt4 key购买 nike

请耐心等待,我知道这是一个奇怪的问题。

我刚刚偶然发现了 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)

当我尝试使用 classgetClass 时,它们都不是 Integer 下的方法,所以我尝试使用 Int反而;我的印象是 Scala 的 Int 只是 Java 的 Integer 的包装器 - 不是这样吗?

我也试过:

  • new Integer()(提示“重载方法构造函数 Integer 与替代项”)
  • new Int()(“类 Int 是抽象的;无法实例化”)
  • 使用 class T extends Int ... new T.getClass.... 扩展 Int 和 Integer (从 final 类非法继承)

为什么这在不能用 Scala 编译的 Java 中有效?我怎样才能在 Scala 中实现 2 + 2 = 5 的愚蠢目标?

最佳答案

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

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

将代码翻译成 Scala 是

val cache = classOf[Integer].getDeclaredClasses.apply(0)
val c = cache.getDeclaredField("cache")
c.setAccessible(true)
val array = c.get(cache).asInstanceOf[Array[Integer]]
array(132) = array(133)
println(2 + 2) // 5

I was under the impression that Scala's Int is just a wrapper around Java's Integer - is this not the case?

不是。通常 scala.Int 对应 Java int

https://github.com/scala/scala/blob/2.13.x/src/library/scala/Int.scala

关于java - 使用反射覆盖 2 + 2 = 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63748255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com