错误将java项目导出到jar

时间:2016-03-07 08:29:40

标签: java jar

我有一个问题,我无法理解为什么eclipse会这样做。我在一个名为Cliente的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项目时,方法内部的代码是不同的?

1 个答案:

答案 0 :(得分: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
    ...
    

您声明您使用反编译器打开了jar。如你所见 字节码我怀疑您的反编译器设置正确。 像jad(以及eclipse的jadclipse插件)之类的反编译器会从字节码生成java代码。由于编译时优化以及不同的java程序可以生成相同的字节码这一事实,您很可能无法获得用于编译的相同Java代码。