JVM и частные методы - PullRequest
       10

JVM и частные методы

5 голосов
/ 25 января 2012

Я новичок в Java.Первое, что я узнал, было то, что метод main () исполняемого класса должен быть public , и причина была в том, что этот метод будет вызываться JVM , он должен быть виден внекласс и, следовательно, должны быть публичными.Теперь, изучая сериализацию, я обнаружил, что частные методы writeObject() и readObject() класса Serializable могут вызываться JVM при сериализации и десериализации объекта!Если это частные методы, то как их может вызвать JVM?Если это так, то почему он не может вызвать метод main ()?

Пролистав некоторую документацию по Java, я прочитал эту строку «JVM может получить доступ к закрытым методам объекта».Поскольку мы вызываем метод readObject () с использованием экземпляра ObjectInputStream, чтобы он был доступен для JVM, тогда как метод main (), являющийся статическим или классовым методом и вызываемый без создания экземпляров какого-либо объекта класса, должен быть общедоступным, чтобы быть доступным для JVM!Имеет ли это смысл ?Я не знаю.

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Это все о конвенции.JVM может вызывать каждый метод везде - это JVM, Boss.Если JVM не может позвонить, никто не может.Представьте, что JVM - это место, где исполняется ваша программа, это своего рода прокси-сервер между вами и вашим байт-кодом.

writeObject может не использоваться вне вашего класса.Это внутренний метод, только для вас.Таким образом, создатели JVM согласились оставить это в тайне.Если он не является закрытым, другие классы в вашей программе могут вызывать его.

Метод main () - это метод, который может вызываться другими процессами Java.Если это личное, другие программы не могут запустить вашу программу.Это не имеет ничего общего с JVM, за исключением того, что вы можете сказать, что обычно JVM позволяет вам (!) Вызывать только открытые (пакетные, защищенные) методы вашего кода.

2 голосов
/ 25 января 2012

В общем, я согласен с @Christian, но у меня есть еще 2 примечания:

  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)); 
        }
      }

http://www.jguru.com/faq/view.jsp?EID=321191

Смотрите также этот замечательный ответ https://stackoverflow.com/a/2489644/1137529

...