bytekit icon indicating copy to clipboard operation
bytekit copied to clipboard

使用InstrumentApi能对类的构造函数进行增强吗,有demo吗

Open shensi199312 opened this issue 4 years ago • 6 comments

shensi199312 avatar Jul 07 '21 11:07 shensi199312

具体是指哪种情况?

hengyunabc avatar Jul 07 '21 11:07 hengyunabc

比如我想增强OkHttpClient

shensi199312 avatar Jul 07 '21 11:07 shensi199312

原类:

public OkHttpClient() {
    this(new Builder());
 }

我想要的增强效果,这样可以吗

@Instrument(Class="okhttp3.OkHttpClient")
public class OkHttpClient {
    List<Interceptor> interceptors;

    public OkHttpClient() {
        InstrumentApi.invokeOrigin();
        interceptors.add(new GatewayCenterOkHttp3Interceptor());
    }
}

shensi199312 avatar Jul 07 '21 11:07 shensi199312

我看源码里面这里绕开了构造函数 image

shensi199312 avatar Jul 07 '21 12:07 shensi199312

我试着改了一下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;
                            }
                        }
                    }

lastboy1228 avatar May 18 '23 07:05 lastboy1228

目前还没有支持 构造函数,后面会支持。

hengyunabc avatar May 31 '23 07:05 hengyunabc