JVM之类的热替换原理解读,数据库事务深入分析

}

}




第二步:写个ClassFileTransformer,利用Javassist等工具进行字节码修改



public class ClassModifierTransformer implements ClassFileTransformer {

@Override

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

// 在这里利用Javassist等工具修改类的字节码,返回修改后类的字节数组

return null;

}

}




目前已经有很多文章讲具体使用方法了,大家可以Google下,我这里先介绍两篇:



*   [基于Java Instrument的Agent实现](https://gitee.com/vip204888/java-p7)

*   [谈谈Java Intrumentation和相关应用](https://gitee.com/vip204888/java-p7)



**原理探究**

========



热替换的核心就在于Instrumentation的两个方法:



void addTransformer(ClassFileTransformer transformer, boolean canRetransform);

void retransformClasses(Class<?>… classes) throws UnmodifiableClassException;




addTransformer()用来注册类的修改器;



retransformClasses()会让类重新加载,从而使得注册的类修改器能够重新修改类的字节码。



下面让我们细细讲讲这两个函数:



**3.1: addTransformer()**



addTransformer的实现在InstrumentationImpl中:



//sun.instrument.InstrumentationImpl

public synchronized void addTransformer(ClassFileTransformer transformer, boolean canRetransform) {

    ......

    mRetransfomableTransformerManager.addTransformer(transformer);

    ......

} 



上面代码省略了一些,可见我们的ClassFileTransformer又被添加到了TransformerManager中,让我们跟进去看看:



//sun.instrument.TransformerManager

public synchronized void addTransformer( ClassFileTransformer    transformer) {

    TransformerInfo[] oldList = mTransformerList;

    TransformerInfo[] newList = new TransformerInfo[oldList.length + 1];

    System.arraycopy(   oldList,

                        0,

                        newList,

                        0,

                        oldList.length);

    newList[oldList.length] = new TransformerInfo(transformer);

    mTransformerList = newList;

} 



ClassFileTransformer对象这次被放入了TransformerManager的一个数组中。



OK,注册完毕,很简单对不对?下面我们再来看下稍微复杂点的retransformClasses()吧。



**3.2: retransformClasses()**



这个方法的实现是个Native方
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值