【问题标题】:Strange Java code奇怪的Java代码
【发布时间】:2013-03-15 12:45:36
【问题描述】:

我找到了下面的代码 sn-p :

import java.lang.reflect.Field;
public class Test {
    public static void main(String[] args) {
        System.out.println("Inside main");
    }
    static {
        try {
            Field value = String.class.getDeclaredField("value");
            value.setAccessible(true);
            value.set("Inside main", value.get("Inside static bolck"));
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

根据我的理解,输出应该是Inside static bolck,但输出是Inside stat,与Inside main的字符长度相同。
*如果我增加 Inside main 的长度,输出长度也会增加。
有人可以解释一下吗? 我对反射的了解不多。

【问题讨论】:

  • 它为我打印Inside static bolck。您使用的是什么版本的 JDK/JRE?
  • IBM 32 位 SDK for Windows,Java 技术版,第 6 版
  • 我会重复 NPE 的问题,因为我也很渴望 -- 无论如何,你打算用这个去哪里?
  • 我找到了代码 sn-p。我没有对此做任何事情。这只是为了我的知识
  • Downvoater 能否请您发表评论,以便我改进我的问题..

标签: java reflection


【解决方案1】:

在我的 JDK 上,String 也有一个 count 成员,需要对其进行更新以反映新的长度。

还有一个 offset 字段,可能需要也可能不需要更新(可能不需要)。

最后,hash 字段在您更改 value 后将不再正确。

由于此代码依赖于 String 的特定实现的未记录细节,因此它非常脆弱且高度不可移植。例如(帽子提示@assylias),Oracle have removed the count and offset fields in JDK 7u6。如果你要从 7u5 升级到 7u6,你的代码会突然变得不同。

【讨论】:

  • 我认为 count 在 JDK 7u6 中消失了(对于 Oracle JDK)。因此,在 7 更新 6+ 时它会起作用,但在它会像问题中那样运行之前。
  • 我找到了代码 sn-p。我没有对此做任何事情。这只是为了我的知识
  • 它为我打印“Inside stat”,这与上面@NPE 所说的内容相关,这可能意味着 OP 正在使用带有 count in 的版本
  • 为我打印“Inside stat” 1.6
【解决方案2】:

代码对 String 类的实际实现做出假设,例如该类有一个名为“value”的字段。

由于 String 类的内部状态不是 API 或语言规范的一部分,因此不同供应商的 VM 甚至同一供应商的不同 VM 版本之间的实际实现会有所不同。

【讨论】:

    【解决方案3】:

    "Inside main" 在 value[] 中包含 11 个字符(value[] 是 String 类中的私有字段)
    字符串value[] 在您定义字符串"Inside main" 的第一个位置被初始化。 现在您正在使用反射更改 value[] 的值,它是 String 中的私有实例变量,然后它必须仅适合字符串 Inside static bolck 中的 11 个字符

    【讨论】:

      【解决方案4】:

      当您更改“Inside main”时,您可以 value.get() 字符串

      "Inside static bolck"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-24
        • 2014-02-21
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多