简单介绍一下:
转载:这个博客 介绍 生成的代理类 介绍的挺详细的 :博客传送门
我的测试代码
流程:(这也是比jdk 快的原因吧)
使用Asm字节码生成代理类(class 文件),读取class文件到内存中,采用FastClass索引执行方法,
1、先查看一下 生成的代理 中的几个方法(动态生成三个代理类)
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\workIDEA\\gitWork\\myProxy\\code")
FastClass 索引类
/*
TestServiceImpl$$EnhancerByCGLIB$$efaddd0d$$FastClassByCGLIB$$4a929a23.class
fastClass 代码片段,
*/
/**
根据hashCode 获取下标,
这个方法会 返回 目标类(TestServiceImpl) 中的所有方法 的下标index
*/
public int getIndex(String str, Class[] clsArr) {
switch (str.hashCode()) {
case -2072611921:
if (str.equals("saveTest")) {
switch (clsArr.length) {
case 1:
if (clsArr[0].getName().equals("java.lang.String")) {
return 8;
}
break;
default:
break;
}
}
break;
/**
invoke 方法
i:下标
ojb:代理对象
objArr:方法参数
*/
public Object invoke(int i, Object obj, Object[] objArr) throws InvocationTargetException {
InvocationTargetException invocationTargetException;
efaddd0d efaddd0d = (efaddd0d) obj;
switch (i) {
case 0:
try {
return new Boolean(efaddd0d.equals(objArr[0]));
} catch (Throwable th) {
invocationTargetException = new InvocationTargetException(th);
}
case 8:
//获取代理对象
return efaddd0d.saveTest((String) objArr[0]);
代理类:
TestServiceImpl$$EnhancerByCGLI
/**
代理类 代码片段
*/
public class TestServiceImpl$$EnhancerByCGLIB$$efaddd0d extends TestServiceImpl implements Factory {
private static final Method CGLIB$saveTest$0$Method = null; //代理类 目标方法
private static final MethodProxy CGLIB$saveTest$0$Proxy = null; // 代理 方法
/*
生成的代理方法
*/
final String CGLIB$saveTest$0(String str) {
return super.saveTest(str); // 这里就走到了 TestServiceImpl 中的方法了
}
目标类的 fastclass TestServiceImpl$$FastClassByCGLIB$$ad7a9bfb
最后 断点跑一下 看看
public Object invokeSuper(Object obj, Object[] args) throws Throwable {
try {
init();
FastClassInfo fci = fastClassInfo;
return fci.f2.invoke(fci.i2, obj, args);//调用 invoke 方法,然后就结束了
} catch (InvocationTargetException e) {
throw e.getTargetException();
}
}
init(); 方法:
synchronized (initLock)
{
if (fastClassInfo == null)
{
CreateInfo ci = createInfo;
FastClassInfo fci = new FastClassInfo();
fci.f1 = helper(ci, ci.c1);
fci.f2 = helper(ci, ci.c2);
fci.i1 = fci.f1.getIndex(sig1);
fci.i2 = fci.f2.getIndex(sig2);
fastClassInfo = fci;
createInfo = null;
}
}
}