java - 奇怪的Java代码

标签 java reflection

我找到了下面的代码片段:

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 的长度,输出长度也会增加。
有人可以解释一下吗? 我对反射知之甚少。

最佳答案

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

还有一个 offset 字段,它可能需要也可能不需要更新(在这种情况下可能不需要)。

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

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

关于java - 奇怪的Java代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15432873/

相关文章:

java - Android 编译器无法找到元数据,即使它存在于 list 文件中

c# - 反射泛型列表类型的属性

java - 我如何知道实例何时创建?

c# - 如何用反射调用List<T>的扩展方法 "ElementAt"?

Java:将短 "if/else"与简单 "return"和尾随 "throw"折叠成单个 "return"

java - 在Java中不使用Math.cos函数实现cos

java - Apache POI : Multiple cell comments in one cell are not allowed

java - 在 NetBeans 中运行 H2 单元测试时出现 StackOverflowError

qt - Qt 有类似 .NET Reflector 的东西吗?

c# - 在运行时创建 C# Web API 2 Controller 时出现异常