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();
}
}