NIN*_*OOP 5 java serialization jvm private public
我是Java的初学者.我学到的第一件事是可执行类的main()方法应该是公共的,并且给出的理由是因为这个方法将由JVM调用,它应该在类外可见,因此应该是公共的.现在在学习系列化我发现,writeObject()和readObject()一个私有方法Serializable的类可以由JVM而序列化被称为和反序列化对象!如果它们是私有方法,那么JVM如何调用它们?如果它可以为什么它不能调用main()方法?
翻阅一些java文档后,我读到了这句话"JVM可以访问对象的私有方法".因为我们使用ObjectInputStream的实例调用readObject(),所以JVM可以访问它,而main()方法是静态或类方法,并且在没有实例化类的任何对象的情况下调用应该是公共的,以便JVM可以访问!那有意义吗 ?我不知道 .
这都是关于惯例的。JVM 可以在任何地方调用每一个方法——它是 JVM,老板。如果 JVM 不能调用它,那么没有人能调用它。想象一下 JVM 是您的程序执行的地方,它是您和字节码之间的某种代理。
writeObject 可能无法在您的类之外使用。这是一种仅限内部的方法,仅供您使用。因此,JVM 的制造商同意将其保留为私有。如果它不是私有的,程序中的其他类就可以调用它。
main() 方法是一个可能被其他 Java 进程调用的方法。如果它是私有的,其他程序将无法启动您的程序。它与 JVM 没有太大关系,但您可以说通常 JVM 允许您(!)仅调用代码的公共(包、受保护)方法。
总的来说,我同意@Christian,但我还有两个注意事项:
main() 函数也可以设为私有。
如果确实需要,您还可以调用私有方法/函数。
1 JVM 无论如何都可以调用 main() 。将其公开后,应用程序的其他代码也可以调用 main() 方法。然而,通常情况下,没有人这样做。main() 公开的主要原因是历史性的,AFAIC。其他程序语言也有 main() 函数,并且它是公共的。
2 如果您确实需要,您可以使用 Core Reflection API 来调用私有方法或访问私有字段。它看起来像这样:
import java.lang.reflect.Field;
class SimpleKeyPair {
private String privateKey = "Cafe Babe"; // private field
}
public class PrivateMemberAccessTest {
public static void main(String[] args) throws Exception {
SimpleKeyPair keyPair = new SimpleKeyPair();
Class c = keyPair.getClass();
// get the reflected object
Field field = c.getDeclaredField("privateKey");
// set accessible true
field.setAccessible(true);
// prints "Cafe Babe"
System.out.println("Value of privateKey: " + field.get(keyPair));
// modify the member varaible
field.set(keyPair, "Java Duke");
// prints "Java Duke"
System.out.println("Value of privateKey: " + field.get(keyPair));
}
}
Run Code Online (Sandbox Code Playgroud)
http://www.jguru.com/faq/view.jsp?EID=321191
另请参阅这个很好的答案/sf/answers/174275111/
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |