Java JDK和CGLib代理

简化版:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值