Spring代理模式(CGLIB动态代理模式)

时间:2023-12-24 11:54:49

jdk动态代理和CGLIB动态代理 没什么太大的区别,CGLIB动态代理不需要接口,但是需要导入jar包。

房东出租房子的方法:

package com.bjsxt.proxy2;

public class FangDong {

    public void  zuFang(){
System.out.println("出租学院东校区对面和顺小区A401");
}
}

核心:CGLIB动态代理模式

package com.bjsxt.proxy2;

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 MethodZj implements MethodInterceptor { //产生代理对象
public Object getProxy(){
Enhancer en=new Enhancer();
//类似于接口
en.setSuperclass(FangDong.class);
en.setCallback(this); //使整个内容生效
Object o = en.create(); return o;
} @Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { /**
* o:被代理的对象
*
* method:被代理对象的方法:public void com.bjsxt.proxy2.FangDong.zuFang()
*
*objects:参数:[Ljava.lang.Object;@4b85612c
*
* methodProxy:代理对象的方法:net.sf.cglib.proxy.MethodProxy@277050dc
*/
System.out.println(method+"---"+objects+"----"+methodProxy);
System.out.println("收取介绍费100"); //调用房东的方法
Object o1 = methodProxy.invokeSuper(o, objects); System.out.println("收取管理费500");
return o1;
}
}

测试类:

package com.bjsxt.proxy2;

public class Test {
public static void main(String[] args) {
MethodZj m=new MethodZj();
FangDong proxy = (FangDong)m.getProxy();
proxy.zuFang();
}
}

Spring代理模式(CGLIB动态代理模式)