TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JDK1.5和JDK1.4编译的不同效果

Posted on 2010-08-29 09:13 TWaver 阅读(1732) 评论(3)  编辑  收藏

平时有时候需要初始化某些参数,经常就直接在一个类里面加一个static,然后把需要初始化的内容写到里面,在外边只需要引用一下这个类就可以了,程序一直运行没有问题,但是最近把JDK升级到1.6发现static中的参数都没有初始化,研究了下发现在1.5及以上版本,JDK修改了编译逻辑,如果只引用下Language.class这种,是不会运行到static里面的代码的,必须类的构造函数被调用才会运行。测试代码如下

 1public class Main {
 2    public static Date date = null;
 3
 4    public static void main(String[] args) {
 5        System.out.println(Language.class);
 6        System.out.println("------------");
 7        System.out.println("date:" + date);
 8        System.out.println("------------");
 9        System.out.println(Language.JAVA);
10    }

11}

12
13public class Language {
14
15    public final static Language[] languages;
16    public final static Language C = new Language("C");
17    public final static Language JAVA = new Language("java");
18    public final static Language FORTRAN = new Language("FORTRAN");
19    static {
20        System.out.println("in static block");
21        languages = new Language[] { C, JAVA, FORTRAN };
22        Main.date = new Date();
23        System.out.println("leave static block");
24    }

25
26    private String name;
27
28    private Language(String name) {
29        this.name = name;
30        System.out.println("create '" + name + "' language");
31    }

32
33    public String toString() {
34        return this.name;
35    }

36
37}
JDK1.4下执行结果
create ‘C’ language
create ‘java’ language
create ‘FORTRAN’ language
in static block
leave static block
class Language
————
date:Mon Aug 02 16:21:42 CST 2010
————
java
JDK1.5下执行结果
class Language
————
date:null
————
create ‘C’ language
create ‘java’ language
create ‘FORTRAN’ language
in static block
leave static block
java

评论

# re: JDK1.5和JDK1.4编译的不同效果  回复  更多评论   

2010-08-29 11:22 by 猪夕笨笨
编译器优化的结果,因为这些代码的内容都是可以在编译期确定,所以就自动优化了。

# re: JDK1.5和JDK1.4编译的不同效果  回复  更多评论   

2010-08-29 22:39 by xylz
"必须类的构造函数被调用才会运行"?
自认为的吧。。。

# re: JDK1.5和JDK1.4编译的不同效果  回复  更多评论   

2010-08-30 10:57 by 隔叶黄莺
这不是编译器的行为。

这在于类在加载时是否被初始化的问题,也就是
Class.forName(String name,boolean initialize,ClassLoader loader);
类加载时上面函数的第二个参数,jdk 1.4 中 可能默认是 true, 而在jdk1.5 中默认为 false,应该可以统一改默认值为 true.

你可以用这样的代码测试一下
Class c = Class.forName("com.unmi.DynamicClass", false, ClassLoader.getSystemClassLoader());

改变第二个参数值,true or false 看看执行效果。

楼主帮忙测试一下面代码行在不同jvm中是否有执行类的 static 部分代码:
ClassLoader.getSystemClassLoader().loadClass("com.unmi.DynamicClass");

只有注册用户登录后才能发表评论。


网站导航: