快速业务通道

解析Java类和对象的初始化过程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
与之相对应的 Spring AOP,你必须通过他的 BeanFactory 获得被 AOP 代理过的受管对象,当然 Jboss AOP 的缺点也很明显--他是和 JBOSS 服务器绑定很紧密的,你不能很轻松的移植到其它服务器上。嗯~……,说到这里有些跑题了,要知道 AOP 实现策略足可以写一本厚厚的书了,嘿嘿,就此打住。

说了这么多,类的初始化时机就是在"在首次主动使用时",那么,哪些情形下才符合首次主动使用的要求呢?

首次主动使用的情形:

·创建某个类的新实例时--new、反射、克隆或反序列化;

·调用某个类的静态方法时;

·使用某个类或接口的静态字段或对该字段赋值时(final字段除外);

·调用Java的某些反射方法时

·初始化某个类的子类时

·在虚拟机启动时某个含有main()方法的那个启动类。

除了以上几种情形以外,所有其它使用JAVA类型的方式都是被动使用的,他们不会导致类的初始化。

我的问题究竟出在哪里

好了,了解了JVM的类初始化与对象初始化机制后,我们就有了理论基础,也就可以理性的去分析问题了。

下面让我们来看看前面[清单一]的JAVA源代码反组译出的字节码:

[清单三]

public class com.ccb.framework.enums.CachingEnumResolver extendsjava.lang.Object{   static {};   Code: 0: new #2;   //class CachingEnumResolver   3: dup   4: invokespecial #14;   //Method "<init>":()V ①   7: putstatic #16;   //Field SINGLE_ENUM_RESOLVER:Lcom/ccb/framework/enums/CachingEnumResolver;   10: new #18;   //class HashMap ②   13: dup   14: invokespecial #19;   //Method java/util/HashMap."<init>":()V   17: putstatic #21;   //Field CODE_MAP_CACHE:Ljava/util/Map;   20: getstatic #21;   //Field CODE_MAP_CACHE:Ljava/util/Map;   23: ldc #23;   //String 0   25: ldc #25;   //String 北京市   27: invokeinterface #31, 3;   //InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; ③   32: pop 33: returnprivate com.ccb.framework.enums.CachingEnumResolver();   Code: 0: aload_0 1: invokespecial #34;   //Method java/lang/Object."<init>":()V 4: invokestatic #37;   //Method initEnums:()V ④ 7: returnpublic static void initEnums();   Code: 0: getstatic #21;   //Field CODE_MAP_CACHE:Ljava/util/Map;   ⑤ 3: ifnonnull 24 6: getstatic #44;   //Field java/lang/System.out:Ljava/io/PrintStream;   9: ldc #46;   //String CODE_MAP_CACHE为空,问题在这里开始暴露.   11: invokevirtual #52;   //Method java/io/PrintStream.println:(Ljava/lang/String;)V 14: new #18;   //class HashMap 17: dup 18: invokespecial #19;   //Method java/util/HashMap."<init>":()V ⑥ 21: putstatic #21;   //Field CODE_MAP_CACHE:Ljava/util/Map;   24: getstatic #21;   //Field CODE_MAP_CACHE:Ljava/util/Map;   27: ldc #54;   //String 1 29: ldc #25;   //String 北京市 31: invokeinterface #31, 3;   //InterfaceMethod java/util/Map.put:(Ljava/lang/Object;   Ljava/lang/Object;)Ljava/lang/Object;   ⑦ 36: pop 37: getstatic #21;   //Field CODE_MAP_CACHE:Ljava/util/Map;   40: ldc #56;   //String 2 42: ldc #58;   //String 云南省 44: invokeinterface #31, 3;   //InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号