好久没写记录了。。。翻出来记录下吧 问题:使用 attach 的方式将新jar包挂到系统上,替换的类不生效,使用premain的方式没问题 分析过程记录: 开始百思不得其解~premain毕竟是启动前装载的,不会有问题,网上搜了各种instrument的例子,都没有说是怎么回事儿~ 后来看了看btrace的源码,找到了一些线索
忽然想到了类的双亲委派机制,所以看下其classloader
返回的是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类,自然就生效了~ |
|
来自: 逍遥居 > 《Instrument》