Cglib
public class Person {
private String name;
private String id;
public void eat(){
System.out.println("The person is eating");
}
}
//方法拦截器
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("这里是对目标类进行增强!!!");
//注意这里的方法调用,不是用反射哦!!!
Object object = proxy.invokeSuper(obj, args);
return object;
}
}
JDK
public interface Animal {
void eat();
}
public class JDKPerson implements Animal{
private String name;
private String id;
@Override
public void eat(){
System.out.println("The person is eating");
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
public MyInvocationHandler(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(obj, args);
return invoke;
}
}
关于测试Dome
public class MainTest {
public static void main(String[] args) {
//Cglib测试类
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(CglibPerson.class);
//设置回调函数
enhancer.setCallback(new MyMethodInterceptor());
//创建真正的代理类
CglibPerson proxyDog = (CglibPerson)enhancer.create();
//调用代理类的eat方法
proxyDog.eat();
//JDK测试类
Animal animal=new JDKPerson();
InvocationHandler handler=new MyInvocationHandler(animal);
ClassLoader loader = animal.getClass().getClassLoader();
Class[] interfaces = animal.getClass().getInterfaces();
Animal animal1 = (JDKPerson) Proxy.newProxyInstance(loader, interfaces, handler);
animal1.eat();
}
}
然而对于实现Aop的原理,在Spring中有关Aop动态代理的源码结构如下:
然而,对于AopProxy这个接口
public interface AopProxy {
Object getProxy();
Object getProxy(ClassLoader var1);
}
这里的很多东西还没看懂,罗马不是一日建成的,先写那么多,后面再补充