jdk动态代理
import com.example.demo.jdk.Advice;
import com.example.demo.jdk.Target;
import com.example.demo.jdk.TargetInterface;
import org.junit.Test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyTest {
@Test
public void test() {
Target target = new Target();
Advice advice = new Advice();
TargetInterface t = (TargetInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
//执行代理对象的任何方法,实质上执行的都是invoke方法
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
advice.before();
Object invoke = method.invoke(target, objects);
advice.after();
return invoke;
}
}
);
t.save();
}
}
cglib动态代理
import com.example.demo.jdk.Advice;
import com.example.demo.jdk.Target;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class MyTest {
@Test
public void test(){
Target target = new Target();
Advice advice = new Advice();
//1. 创建增强器
Enhancer enhancer = new Enhancer();
//2. 将目标类设置为父类
enhancer.setSuperclass(Target.class);
//3. 设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
advice.before(); // 前置增强
Object invoke = method.invoke(target, objects);
advice.after(); // 后置增强
return invoke;
}
});
//4. 创建代理对象
Target t = (Target) enhancer.create();
//5. 执行代理对象的方法
t.save();
}
}