bytekit
bytekit copied to clipboard
使用InstrumentApi能对类的构造函数进行增强吗,有demo吗
具体是指哪种情况?
比如我想增强OkHttpClient
原类:
public OkHttpClient() {
this(new Builder());
}
我想要的增强效果,这样可以吗
@Instrument(Class="okhttp3.OkHttpClient")
public class OkHttpClient {
List<Interceptor> interceptors;
public OkHttpClient() {
InstrumentApi.invokeOrigin();
interceptors.add(new GatewayCenterOkHttp3Interceptor());
}
}
我看源码里面这里绕开了构造函数

我试着改了一下transform方法,目前成功把void _bytekit_init()方法的逻辑注入到目标构造函数里
// 跳过真的构造函数
if(AsmUtils.isConstructor(methodNode)){
continue;
}
// 处理伪构造函数
if (methodNode.name.equals("_bytekit_init")) {
final String _ConstructorName = "<init>";
MethodNode findMethod = AsmUtils.findMethod(originClassNode.methods, _ConstructorName, methodNode.desc);
if (findMethod == null) {
continue;
}
MethodNode updatedMethodNode = InstrumentImpl.replaceInvokeOrigin(originClassNode.name,
findMethod, methodNode);
updatedMethodNode.access = findMethod.access;
logger.info("{}的构造函数{}被注入", instrumentClassNode.name, methodNode.desc);
for (int index = 0; index < targetClassNode.methods.size(); ++index) {
MethodNode tmp = targetClassNode.methods.get(index);
if (tmp.name.equals(_ConstructorName) && tmp.desc.equals(updatedMethodNode.desc)) {
updatedMethodNode.name = _ConstructorName;
targetClassNode.methods.set(index, updatedMethodNode);
break;
}
}
}
目前还没有支持 构造函数,后面会支持。