Quando a execução dos operadores binários acontece em Java?

Estou tentando entender o código de bytes java. Comecei com um exemplo simples:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(2 + 1);
    }
}

Eu compilei esta classe:

javac Test.java

E então eu tentei umjavap na classe. assim:

javap -c Test

o que me deu o seguinte:

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        
}

Eu poderia fazer sentido com isso, além desta linha:

public static void main(java.lang.String[]);
. . . 
3: iconst_1    
. . .

olhando para a minha fonte e este código de bytes, parece que o javac já fez a operação de adição para esta declaração:

2+1

e pedindo à jvm para retornar essa constante.

Alguém pode me corrigir se meu entendimento estiver errado? O javac executa a operação de compilação para+,-,* etc antes que ele realmente execute na jvm? Se sim, como?

questionAnswers(1)

yourAnswerToTheQuestion