将java项目导出到jar时出错
我有一个问题,我不明白为什么eclipse会这样做。我在java类中有一个名为将java项目导出到jar时出错,java,jar,Java,Jar,我有一个问题,我不明白为什么eclipse会这样做。我在java类中有一个名为Cliente的方法。一切都进行得很顺利,但是当我导出jar时,我看到了带有反编译器的代码,我不明白为什么这个方法不好。我的方法中的一些代码: public RespuestaEnvio enviar(Envio mensaje){ log.info(modulo, "Preparando el envío del mensaje: "+mensaje.getMensaje()); S
Cliente
的方法。一切都进行得很顺利,但是当我导出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.
公共响应Envio enviar(Envio mensaje){
log.info(模数,“Preparando el envío del mensaje:+mensaje.getMensaje());
字符串mensajeError=“”;
布尔笛卡尔=假;
BeanCambioSituacion BeanCambioSituacion=新的BeanCambioSituacion(mensaje);
//瓦利丹·坎波斯义务酒店
if(isVacia(beanCambioSituacion.getCodigoPedido()){
对数误差(模,“Código de pedido sin valor.”);
笛卡尔=真;
}
if(isVacia(beanCambioSituacion.getNumeroEnvio()){
log.error(模,“Número de envío sin valor.”);
笛卡尔=真;
}
此方法使用反编译器查看代码:
/*错误*/
公共管理文托斯·RespuestaEnvio enviar(管理文托斯·Envio mensaje)
{
//字节码:
//0:aload_0
//1:getfield49-es/chx/ws/eci/cambiaEstado/Cliente:log-Les/chx/ws/eci/domain/LogUtil;
//4:aload_0
//5:getfield41es/chx/ws/eci/cambiaEstado/Cliente:modulo Ljava/lang/String;
//8:新的116 java/lang/StringBuilder
//11:dup
//12:最不发达国家-15
//14:invokespecial 120 java/lang/StringBuilder:(Ljava/lang/String;)V
//17:aload_1
//18:invokeVirtual243 gestionEventos/Envio:getMensaje()Ljava/lang/String;
//21:invokeVirtual121 java/lang/StringBuilder:append(Ljava/lang/String;)Ljava/lang/StringBuilder;
//24:invokevirtual131 java/lang/StringBuilder:toString()Ljava/lang/String;
//27:invokevirtual134 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:248新es/chx/ws/eci/bean/Beancambiostiacion
//38:dup
//39:aload_1
//40:invokespecial 250 es/chx/ws/eci/bean/BeanCambioSituacion:(LgestionEventos/Envio;)V
//43:astore 4
//45:aload_0
//46:aload 4
//48:invokevirtual253es/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项目时,方法内部的代码不同?java就是这样工作的:) 您使用java语言编写代码。您(或eclipse)使用java编译器(javac)编译该代码,它将生成jvm字节码。字节码用作java虚拟机(jvm)的输入,该虚拟机能够解释和执行它 当您打开编译并绑定的jar时,您将看到字节码。 通过一些幻想/知识,您实际上可以看到它仍然是您的代码: 例如:
- 记录某事
/domain/LogUtil; 4: aload_0 5: getfield 41 es/chx/ws/eci/cambiaEstado/Cliente:modulo Ljava/lang/String;
- 结合日志消息和mensaje.getMensaje()的输出
像jad这样的反编译器(以及eclipse的jadclipse插件)从字节码生成java代码。由于编译时优化以及不同java程序可以生成相同字节码的事实,您很可能无法获得用于编译的相同java代码。欢迎使用堆栈溢出!我编辑了您的问题,将您的输出适当缩进4个空格,以便呈现pr操作-有关格式的更多信息,请参阅编辑帮助。我还修复了一些小的语法错误。祝你好运!
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
...
35: new 248 es/chx/ws/eci/bean/BeanCambioSituacion
...