2016-03-07 113 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代码。