在eclipse里面我建了以下两个java文件A和B如下: public class A { public static final boolean flg = 0 == 0; } 和 public class B { public static void main(String[] arg) { System.out.println("test"+ A.flg); } }编译上面A和B以后得到class文件,然后我将其中的B再反编译成java文件得到的是public class B { public B(){} public static void main(String args[]){ System.out.println("testtrue"); } },然后我修改A文件,改为public class A { public static final boolean flg = "0".equals("0"); } 在eclipse中重新编译,与之关联的B也被重新编译了,我将B再反编译成java文件得到的是 public class B { public B(){} public static void main(String args[]){ System.out.println((new StringBuilder("test")).append(A.flg).toString()); } }虽然前后两次编译的class运行结果都是testtrue,但是编译出来的class还是和我想象的不一样,JVM似乎做了某些优化.有没有哪位高手能分析一下JAVA的编译机制.
public class A {
public static final boolean flg = 0 == 0;
}
和
public class B {
public static void main(String[] arg) {
System.out.println("test"+ A.flg);
}
}编译上面A和B以后得到class文件,然后我将其中的B再反编译成java文件得到的是public class B {
public B(){} public static void main(String args[]){
System.out.println("testtrue");
}
},然后我修改A文件,改为public class A {
public static final boolean flg = "0".equals("0");
}
在eclipse中重新编译,与之关联的B也被重新编译了,我将B再反编译成java文件得到的是
public class B {
public B(){} public static void main(String args[]){
System.out.println((new StringBuilder("test")).append(A.flg).toString());
}
}虽然前后两次编译的class运行结果都是testtrue,但是编译出来的class还是和我想象的不一样,JVM似乎做了某些优化.有没有哪位高手能分析一下JAVA的编译机制.
加载和编译是两码事吧.不编译怎么会得到最新的class文件呢.