java中私有变量的序列化

2024-03-03

我有一个关于序列化的问题。如果我的类有私有变量并且没有 getter 和 setter,那么序列化 API 将如何读取这些变量的值。


首先,访问权限是编译时功能。访问在运行时不受控制。

这可能会让您感到困惑,但请尝试执行以下操作: 创建 A 类的 2 个版本:

1

public class A {
    public foo() {
        System.out.println("hello");
    }
}

2

public class A {
    private foo() {
        System.out.println("hello");
    }
}

现在编写调用 new A().foo() 的类,并使用类 A 的第一个版本对其进行编译。然后将第二个版本放入类路径中并运行应用程序。它会起作用的!

因此,不必担心访问权限:它们总是可以被绕过。

例如,如果您使用反射来调用私有方法foo()你必须获取该方法然后调用setAccessible(true):

Method m = A.class.getMethod("foo",
null); m.setAccessible(true);
m.invoke(new A(), null);

如果我们可以从代码中访问私有方法,请确保 JDK 类可以做到这一点,即使它们是用 java 编写的。顺便说一句,据我所知,标准 java 序列化是作为本机代码实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中私有变量的序列化 的相关文章

随机推荐