分享

jdk6方式 instrument 装载新类不生效的原因

 逍遥居 2015-03-23
好久没写记录了。。。翻出来记录下吧
问题:使用 attach 的方式将新jar包挂到系统上,替换的类不生效,使用premain的方式没问题
分析过程记录:
开始百思不得其解~premain毕竟是启动前装载的,不会有问题,网上搜了各种instrument的例子,都没有说是怎么回事儿~ 后来看了看btrace的源码,找到了一些线索
btrace的Main源码看到了这句:
 Class[] classes = Main.inst.getAllLoadedClasses();
。。。
Main.inst.retransformClasses(classes);
忽然想到了类的双亲委派机制,所以看下其classloader
 System.out.println(TransClass.class.getClassLoader());  == null
返回的是null,说明是bootstrap装载的,这时如果直接用下面这种方式重新定义类
inst.addTransformer(new Transformer1 (), true);
inst.retransformClasses(TransClass.class);
因为还是会先向上查找,所以找到的还是原有的类,自然不会起作用
新的类定义在新jar包中,应该是AppClassLoader装载的才会生效,所以使用了下面的方式测试下效果:
inst.addTransformer(new Transformer1 (), true);
Class[] classes2 = inst.getAllLoadedClasses();
for (Class cls : classes2) {
if(cls.getName().endsWith("TransClass")){
System.out.println(cls.getClassLoader()); //输出为AppClassLoader
inst.retransformClasses(cls);
}
}
OK~ 问题找到了,根据双亲委派机制,应避免又自动向上查找,所以直接传入AppClassLoader中找到的TransClass类,自然就生效了~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多