我有一个问题,我无法理解为什么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项目时,方法内部的代码是不同的?
答案 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代码。