欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

代理模式——CGLIB动态代理

程序员文章站 2022-06-09 21:39:39
...

CGLIB动态代理相较于JDK动态代理的优点是,即使没有接口的操作,也可以使用

被代理类

package com.zxw.cglib;

public class Star {
    public void show(){
        System.out.println("明星表演");
    }
}

代理类

package com.zxw.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MethodInv implements MethodInterceptor {
    //创建代理对象
    public Object getProxy(){
        Enhancer enhancer=new Enhancer();
        //类似于jdk动态代理的接口
        enhancer.setSuperclass(Star.class);
        enhancer.setCallback(this);
        //整个设置生效
        Object o = enhancer.create();
        return o;
    }
    //相当于jdk动态代理的invoke
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        /**
         * o:被代理对象
         * method:被代理对象的方法
         * objects:参数
         * methodProxy:代理对象中方法
         * */
        //public void com.zxw.cglib.Star.show()
        // [Ljava.lang.Object;@446cdf90
        // [email protected]
        System.out.println(method+"---"+objects+"---"+methodProxy);
        Object o1 = methodProxy.invokeSuper(o, objects);
        return o1;
    }
}

测试类

package com.zxw.cglib;

public class Test {
    public static void main(String[] args) {
        MethodInv m=new MethodInv();
        //调用动态创建代理类对象
        Star star = (Star) m.getProxy();
        //代理类对象中的show通过invoke调用被代理类的show
        star.show();
    }
}