简化版:
JDK:
public class JDKProxyTest {
public static void main(String[] args) {
IAnimal animal = (IAnimal) Proxy.newProxyInstance(Cat.class.getClassLoader(), Cat.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(new Cat(), args);
after();
return result;
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
});
Cat cat = (Cat) animal;
cat.eat();
}
}
class Cat implements IAnimal {
@Override
public void eat() {
System.out.println("cat eats");
}
}
interface IAnimal {
void eat();
}
Cglib:
public class CGLibProxyTest {
public static void main(String[] args) {
MethodInterceptor methodInterceptor = new MethodInterceptor(){
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
Object result = methodProxy.invokeSuper(o,objects);
after();
return result;
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
};
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Cat.class);
enhancer.setCallback(methodInterceptor);
Cat cat = (Cat)enhancer.create();
cat.eat();
}
}
class Cat {
public void eat() {
System.out.println("cat eats");
}
}
JDK:
生成代理类,实现了被代理类的接口,代理类的方法调用时执行InvocationHandler实现类的invoke方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Author: ZhangHao
* @Description: JDK代理测试
* @Date: 2020/8/25 14:05
* @Version: 1.0
*/
public class JDKProxyTest {
public static void main(String[] args) {
new AnimalProxyCreater().getProxyObject(new Cat()).eat();
}
}
class Cat implements IAnimal {
@Override
public void eat() {
System.out.println("cat eats");
}
}
interface IAnimal {
void eat();
}
class AnimalProxyCreater implements InvocationHandler {
private IAnimal target;
IAnimal getProxyObject(IAnimal target) {
this.target = target;
Class<?> clazz = target.getClass();
// 生成代理类,实现了被代理类的接口,代理类的方法调用时执行InvocationHandler实现类的invoke方法
return (IAnimal) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(this.target, args);
after();
return result;
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
}
CGLib:
生产代理类,继承被代理类,无需被代理类实现接口,代理类的方法(非final)调用时执行MethodInterceptor实现类的intercept方法。
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency>
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Author: ZhangHao
* @Description: CGLib代理测试
* @Date: 2020/8/25 14:37
* @Version: 1.0
*/
public class CGLibProxyTest {
public static void main(String[] args) {
((Cat)new AnimalProxyCreater().getProxyObject(Cat.class)).eat();
}
}
class Cat {
public void eat() {
System.out.println("cat eats");
}
}
class AnimalProxyCreater implements MethodInterceptor {
Object getProxyObject(Class<?> clazz) {
// 生产代理类,继承被代理类,无需被代理类实现接口,代理类的方法(非final)调用时执行MethodInterceptor实现类的intercept方法
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
Object result = methodProxy.invokeSuper(o,objects);
after();
return result;
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
}
JDK1.6之前CGLib快于JDK,1.6之后调用次数多时CGLib快于JDK,1.8开始JDK快于CGLib。Spring中默认Bean实现接口时使用JDK,没有实现接口使用CGLib。强制使用CGLib的配置为:<aop:aspectj-autoproxy proxy-target-class=”true”/>。(JDK和CGLib代理对比可参考:https://www.cnblogs.com/sandaman2019/p/12636727.html)