JVM和私有方法

NIN*_*OOP 5 java serialization jvm private public

我是Java的初学者.我学到的第一件事是可执行类的main()方法应该是公共的,并且给出的理由是因为这个方法将由JVM调用,它应该在类外可见,因此应该是公共的.现在在学习系列化我发现,writeObject()readObject()一个私有方法Serializable的类可以由JVM而序列化被称为和反序列化对象!如果它们是私有方法,那么JVM如何调用它们?如果它可以为什么它不能调用main()方法?

翻阅一些java文档后,我读到了这句话"JVM可以访问对象的私有方法".因为我们使用ObjectInputStream的实例调用readObject(),所以JVM可以访问它,而main()方法是静态或类方法,并且在没有实例化类的任何对象的情况下调用应该是公共的,以便JVM可以访问!那有意义吗 ?我不知道 .

Chr*_*ian 5

这都是关于惯例的。JVM 可以在任何地方调用每一个方法——它是 JVM,老板。如果 JVM 不能调用它,那么没有人能调用它。想象一下 JVM 是您的程序执行的地方,它是您和字节码之间的某种代理。

writeObject 可能无法在您的类之外使用。这是一种仅限内部的方法,仅供您使用。因此,JVM 的制造商同意将其保留为私有。如果它不是私有的,程序中的其他类就可以调用它。

main() 方法是一个可能被其他 Java 进程调用的方法。如果它是私有的,其他程序将无法启动您的程序。它与 JVM 没有太大关系,但您可以说通常 JVM 允许您(!)仅调用代码的公共(包、受保护)方法。


ale*_*ail 3

总的来说,我同意@Christian,但我还有两个注意事项:

  1. main() 函数也可以设为私有。

  2. 如果确实需要,您还可以调用私有方法/函数。

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/