在 java 中序列化私有变量12

2022-09-03 04:26:50

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


答案 1

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

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

1

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

2

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

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

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

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

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

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


答案 2

序列化 API 不担心私有变量。其目的是将对象转换为文件中的二进制表示形式或以后可以重建的某种其他类型的存储。

下面对 Java 的序列化算法进行了说明。