CGLIB动态代理

CGLIB是第三方包,与JDK动态代理不同,不需要接口。

导包:



    cglib
    cglib
    3.1


类(需代理的类):

public class UserImp  {

    public void say(String str) {
        System.out.println("asd"+str);
    }
 
    public void haha() {
        System.out.println("哈哈");
    }
}

动态代理类:

public class CGLIBProxy implements MethodInterceptor {
    /*
    * 获取代理对象
    *       参数:
    *           obj:需代理对象的Class
    * */
    public Object getProxy(Class obj){
        // CGLIB enhancer 增强类对象
        Enhancer enhancer = new Enhancer();
        // 设置需增强的类
        enhancer.setSuperclass(obj);
        // 定义代理逻辑对象为当前对象,必须实现MethodInterceptor接口
        enhancer.setCallback(this);
        // 生成并返回代理对象
        return enhancer.create();
    }

    /*
    * 代理方法执行逻辑
    * */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("调用真实对象前操作");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("调用真实对象后操作");
        return result;
    }
}

测试类:

/*
* CGLIB代理
* */
@Test
public void test1(){
    CGLIBProxy cp = new CGLIBProxy();
    UserImp proxy =(UserImp) cp.getProxy(UserImp.class);
    proxy.say("aaa");
    proxy.haha();
}

结果:
调用真实对象前操作
asdaaa
调用真实对象后操作
调用真实对象前操作
哈哈
调用真实对象后操作

你可能感兴趣的:(JAVA)