java代理模式

1 静态代理

接口

public interface ZuFANG {
	public void zuFANG();
}

具体实现类

public class FangDong implements ZuFANG{
    
    	@Override
    	public void zuFANG() {
    		System.out.println("我是房东");
    	}
    }

代理类

public class ZhongjieProxy implements ZuFANG{
	private FangDong fangdong;

	public ZhongjieProxy(FangDong fangdong) {
		this.fangdong = fangdong;
	}

	@Override
	public void zuFANG() {
		System.out.println("代理租房开始");
		fangdong.zuFANG();
		System.out.println("代理租房结束");
	}

}

测试类

public class ProxyTest {
	public static void main(String[] args) {
		FangDong fangDong = new FangDong();
		ZhongjieProxy proxy = new ZhongjieProxy(fangDong);
		proxy.zuFANG();
	}
}

2 JDK动态代理

public class JDKProxy implements InvocationHandler{

private Object target;

public JDKProxy(Object target) {
	this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	Object object = method.invoke(target, args);
	return object;
}
}

public class ProxyTest {
	
	public static void main(String[] args) {
		FangDong fangDong = new FangDong();
		
		JDKProxy jdkProxy = new JDKProxy(fangDong);
		//ClassLoader loader:指定当前目标对象使用类加载器,写法固定
		//Class<?>[] interfaces:目标对象实现的接口的类型,写法固定
		//InvocationHandler h:事件处理接口,需传入一个实现类,一般直接使用匿名内部类
		ZuFANG zufang = (ZuFANG) Proxy.newProxyInstance(fangDong.getClass().getClassLoader(), fangDong.getClass().getInterfaces(), jdkProxy);
		zufang.zuFANG();
	}
}

3 CGLIB动态代理

   public class CGLIBProxy implements MethodInterceptor{
	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy method) throws Throwable {
		Object obj = method.invokeSuper(arg0, arg2);
		return obj;
	}
}
CGLIBProxy cglibProxy = new CGLIBProxy();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(FangDong.class);
enhancer.setCallback(cglibProxy);
ZuFANG zufang = (ZuFANG) enhancer.create();
zufang.zuFANG();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值