2012-01-25 22 views
5

Sono un principiante in Java. La prima cosa che ho imparato è che il metodo main() di una classe eseguibile dovrebbe essere pubblico e il motivo dato era dato dal fatto che questo metodo verrà chiamato dallo JVM che dovrebbe essere visibile all'esterno della classe e quindi dovrebbe essere pubblico. Ora mentre studio la serializzazione, trovo che i metodi privati ​​writeObject() e readObject() di una classe Serializable possono essere chiamati dalla JVM durante la serializzazione e la de-serializzazione di un oggetto! Se sono metodi privati, allora come può chiamarli JVM? Se può allora perché non può chiamare il metodo main()?JVM e metodi privati ​​

Dopo sfogliando una certa documentazione java, ho letto questa linea "JVM può accedere metodi privati ​​di un oggetto". Poiché chiamiamo readObject() usando un'istanza di ObjectInputStream in modo che sia accessibile a JVM, mentre il metodo main() essendo un metodo statico o di classe e chiamato senza creare un'istanza qualsiasi oggetto della classe dovrebbe essere pubblico per essere accessibile a JVM! Ha senso ? Non lo so .

+0

Dovrebbe essere pubblica, ma ti ha detto la ragione sbagliata. Il motivo corretto è perché è stato detto in Java Language Reference. – Ingo

risposta

2

Bene, in generale, sono d'accordo con @Christian, ma ho altre 2 note:

  1. La funzione main() potrebbe essere anche fatto privato.

  2. È possibile anche chiamare il metodo/funzione privata, se si ha realmente bisogno.

1 JVM può chiamare comunque main(). Rendendolo pubblico abilita anche un altro codice della tua applicazione a chiamare anche il metodo main(). Normalmente, nessuno lo fa, comunque. Il motivo principale, perché main() è pubblico, è storico, AFAIC. Altre lingue del programma hanno anche la funzione main() e lì è pubblica.

2 Se si ha realmente bisogno, è possibile utilizzare Nucleo Reflection API al fine di chiamare il metodo privato o per accedere campo privato. Sembra qualcosa di simile:

 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

Vedi anche questo grande risposta https://stackoverflow.com/a/2489644/1137529

4

Si tratta di convenzione. La JVM può chiamare ogni metodo ovunque: è la JVM, la Boss. Se la JVM non può chiamarla, nessuno può. Immagina che la JVM sia il luogo in cui il tuo programma viene eseguito, è una specie di proxy tra te e il tuo bytecode.

writeObject potrebbe non essere utile al di fuori della classe. È un metodo solo interno, solo per te. Così i creatori della JVM hanno accettato di lasciarlo privato. Se non è privato, altre classi nel tuo programma sono in grado di chiamarlo.

Il metodo main() è un metodo che potrebbe essere chiamato da altri processi Java. Se è privato, altri programmi non sono in grado di avviare il programma. Non ha molto a che fare con la JVM, tranne che potresti dire che normalmente la JVM ti permette (!) Di chiamare solo metodi pubblici (pacchetto, protetti) del tuo codice.

Problemi correlati