Sto cercando di capire il codice byte java. Ho iniziato con semplice esempio:Quando l'esecuzione degli operatori binari avviene in Java?
public class Test
{
public static void main(String args[])
{
System.out.println(2 + 1);
}
}
ho compilato questa classe:
javac Test.java
E poi ho cercato di un javap
sulle .class come questo:
javap -c Test
che mi ha dato questo :
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: iconst_1
4: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
7: return
}
ho potuto in grado di dare un senso fuori di esso, oltre a questa linea:
public static void main(java.lang.String[]);
. . .
3: iconst_1
. . .
guardando la mia fonte e questo codice di byte, si presenta come javac già fatto l'operazione di aggiunta per questa dichiarazione:
2+1
e chiedere a jvm di restituire quella costante.
Qualcuno può correggermi se la mia comprensione è sbagliata? Javac esegue l'operazione su compilazione per +
, -
, *
ecc prima che funzioni effettivamente su jvm? Se é cosi, come?
È un costante, ottimizzato in fase di compilazione. –
Il "come" è piuttosto facile-matematica. Il compilatore sa che sono numeri, non possono cambiare e sono addendabili. –