2016-03-07 85 views
-1

我有一個問題,我不明白爲什麼日食使這個。我有一個叫做Cliente的java類中的方法。一切順利,但是當我導出jar時,我看到了一個反編譯器的代碼,我不明白爲什麼這種方法不好。一些代碼從我的方法:錯誤導出java項目到jar中

public RespuestaEnvio enviar(Envio mensaje){ 
    log.info(modulo, "Preparando el envío del mensaje: "+mensaje.getMensaje()); 
      String mensajeError = ""; 
      boolean descartar = false; 
      BeanCambioSituacion beanCambioSituacion = new BeanCambioSituacion(mensaje); 
      // Se validan campos obligatorios 
      if(isVacia(beanCambioSituacion.getCodigoPedido())){ 
       log.error(modulo, "Código de pedido sin valor."); 
       descartar = true; 
      } 

      if(isVacia(beanCambioSituacion.getNumeroEnvio())){ 
       log.error(modulo, "Número de envío sin valor."); 
       descartar = true; 
      } 

This method with a decompiler seeing the code: 

/* Error */ 
    public gestionEventos.RespuestaEnvio enviar(gestionEventos.Envio mensaje) 
    { 


// Byte code: 
// 0: aload_0 
// 1: getfield 49 es/chx/ws/eci/cambiaEstado/Cliente:log Les/chx/ws/eci/domain/LogUtil; 
// 4: aload_0 
// 5: getfield 41 es/chx/ws/eci/cambiaEstado/Cliente:modulo Ljava/lang/String; 
// 8: new 116 java/lang/StringBuilder 
// 11: dup 
// 12: ldc -15 
// 14: invokespecial 120 java/lang/StringBuilder:<init> (Ljava/lang/String;)V 
// 17: aload_1 
// 18: invokevirtual 243 gestionEventos/Envio:getMensaje()Ljava/lang/String; 
// 21: invokevirtual 121 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
// 24: invokevirtual 131 java/lang/StringBuilder:toString ()Ljava/lang/String; 
// 27: invokevirtual 134 es/chx/ws/eci/domain/LogUtil:info (Ljava/lang/String;Ljava/lang/String;)V 
// 30: ldc -114 
// 32: astore_2 
// 33: iconst_0 
// 34: istore_3 
// 35: new 248 es/chx/ws/eci/bean/BeanCambioSituacion 
// 38: dup 
// 39: aload_1 
// 40: invokespecial 250 es/chx/ws/eci/bean/BeanCambioSituacion:<init> (LgestionEventos/Envio;)V 
// 43: astore 4 
// 45: aload_0 
// 46: aload 4 
// 48: invokevirtual 253 es/chx/ws/eci/bean/BeanCambioSituacion:getCodigoPedido ()Ljava/lang/String; 
// 51: invokevirtual 256 es/chx/ws/eci/cambiaEstado/Cliente:isVacia (Ljava/lang/String;)Z 
// 54: ifeq +19 -> 73 
// 57: aload_0. 

任何人都可以給一些信息,我不明白爲什麼會發生這種情況。代碼完全不同。這是我的問題。爲什麼當我導出java項目時,代碼在方法內部是不同的?

+0

歡迎來到Stack Overflow!我編輯了你的問題,正確地縮進你的輸出4個空格,以便正確呈現 - 請參閱編輯幫助以獲取更多格式化信息。我還修復了一些小的語法錯誤。祝你好運! – Wtower

回答

1

嗯,這是如何java工作:)

你用java語言寫你的代碼。您(或eclipse)使用java編譯器(javac)編譯該代碼,並生成jvm-bytecode。字節碼被用作java-virtual-machine(jvm)的輸入,它可以解釋並執行它。

當你打開編譯和捆綁的jar時,你會看到字節碼。 有了一些幻想/知識,你可以清楚地看到,它仍然是你的代碼:

例如:

  • 日誌東西

    /domain/LogUtil; 
    4: aload_0 
    5: getfield 41 es/chx/ws/eci/cambiaEstado/Cliente:modulo Ljava/lang/String; 
    
  • 結合您的登錄信息和輸出mensaje.getMensaje()

    8: new 116 java/lang/StringBuilder 
    11: dup 
    12: ldc -15 
    14: invokespecial 120 java/lang/StringBuilder:<init> (Ljava/lang/String;)V 
    17: aload_1 
    18: invokevirtual 243 gestionEventos/Envio:getMensaje()Ljava/lang/String; 
    21: invokevirtual 121 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    24: invokevirtual 131 java/lang/StringBuilder:toString ()Ljava/lang/String; 
    27: invokevirtual 134 es/chx/ws/eci/domain/LogUtil:info (Ljava/lang/String;Ljava/lang/String;)V 
    ... 
    
  • 新BeanCambioSituacion(mensaje)

    35: new 248 es/chx/ws/eci/bean/BeanCambioSituacion 
    ... 
    

幽州,你有一個反編譯器打開罐子。當你看到 字節碼時,我懷疑你的反編譯器是否正確設置。反編譯器就像jad(和eclipse的jadclipse插件)一樣從字節碼生成java代碼。由於編譯時優化以及不同的java程序可以產生相同的字節碼,所以很可能不會獲得用於編譯的相同java代碼。