java动态代理实现案例

一、jdk动态代理案例

public class JdkProxy implements InvocationHandler {
    public Object object;
    public JdkProxy(Object object){
        this.object=object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行代理前----->");
        Object invoke = method.invoke(object, args);
        System.out.println("执行代理后----->");
        return invoke;
    }

    public static void main(String[] args) {
        AoDi aoDi=new AoDi();
        JdkProxy jdkProxy=new JdkProxy(aoDi);
        //jdk动态代理通过反射机制生产代理
        Car car = (Car)Proxy.newProxyInstance(aoDi.getClass().getClassLoader(), aoDi.getClass().getInterfaces(), jdkProxy);
        car.run();
    }
}

java动态代理实现案例_第1张图片

二、Cglib动态代理案例 

所需包:

public class CglibProxy implements MethodInterceptor {
    @Override
    public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("执行方法前");
        Object invokeSuper = methodProxy.invokeSuper(object, args);
        System.out.println("执行方法后");
        return invokeSuper;
    }

    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        //动态代理使用asm框架产生代理
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(AoDi.class);
        enhancer.setCallback(cglibProxy);
        Car car = (Car) enhancer.create();
        car.run();
    }
}

java动态代理实现案例_第2张图片

三、CGLIB与JDK动态代理区别 

  jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。

注:asm其实就是java字节码控制.

你可能感兴趣的:(菜鸟JAVA之旅)