proxy connect abort处理方法_Java代理设计模式(Proxy)的几种具体实现
Proxy是一種結構設計模型,主要解決對象直接訪問帶來的問題,代理又分為靜態(tài)代理和動態(tài)代理(JDK代理、CGLIB代理。
靜態(tài)代理:又程序創(chuàng)建的代理類,或者特定的工具類,在平時開發(fā)中經常用到這種代理模式,這種一般在程序運行前就已經生成對應的class文件;
動態(tài)代理:在程序運行時通過反射機制動態(tài)創(chuàng)建。
下面通過一個場景實現以下三種代理方式
- 步驟一:定義商店接口(Subject)
- 步驟二:個人店家運營(RealSubject)
- 步驟三:平臺運營(proxy)
- 步驟四:個體消費(client)
幾種代理方式都會用到Subject、RealSubject,現在這里定義
Store.java(Subject):定義兩個接口operate(運營),business(交易)。
public interface Store { /** * 店鋪運營 */ public void operate(); /** * 店鋪交易 */ public void business();}PersonStore.java(RealSubject) 單個用戶運營
public class PersonStore implements Store { @Override public void operate() { System.out.println("個人商店運營"); } @Override public void business() { System.out.println("個人商店交易"); }}靜態(tài)代理
靜態(tài)代理的實現比較簡單,代理類通過實現與目標對象相同的接口,并在類中維護一個代理對象,這種場景用于個體商家比較少的情況,如果多的話代理類十分繁多、不易維護
創(chuàng)建靜態(tài)代理類
ProxyStroe.java(proxy):在代理平臺運營是收取管理費用100,這個代理類需要實現Store接口,并制定目標類target(PersonStore)。
public class ProxyStroe implements Store{ private Store personStore = new PersonStore(); @Override public void operate() { System.out.println("收取管理費用100元"); personStore.operate(); } @Override public void business() { personStore.business(); }}靜態(tài)代理調用
StaticConsumer.java(client):通過創(chuàng)建ProxyStroe去代理PersonStore,并進行操作。
public class StaticConsumer { public static void main(String[] args) { ProxyStroe store = new ProxyStroe(); store.operate(); store.business(); }}動態(tài)代理
JDK代理
動態(tài)代理類是通過接口實現的,利用攔截器(攔截器必須實現InvocationHanlder)加上反射機制生成一個實現代理接口的匿名類,
在調用具體方法前調用InvokeHandler來處理。
創(chuàng)建jdk代理類
JDKStoreHandler.java(proxy):通過實現InvocationHandler接口的invoke方法,在里面進行反射調用,newProxyInstanse通過目標對象創(chuàng)建真是對象。
public class JDKStoreHandler implements InvocationHandler { /** * 目標對象 */ private Object targetObject; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("operate".equals(method.getName())){ System.out.println("收取管理費用100元"); } return method.invoke(targetObject, args); } /** * * @param targetObject * @return */ public Object newProxyInstanse(Object targetObject){ this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this); }}JDK代理對象調用
JDKDynamicConsumer.java(proxy):通過JDKStoreHandler的newProxyInstanse創(chuàng)建真實目標對象,并調用接口的方法
public class JDKDynamicConsumer { public static void main(String[] args) { Store store = (Store)new JDKStoreHandler().newProxyInstanse(new PersonStore()); store.operate(); store.business(); }}CGLIB代理
cglib動態(tài)代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節(jié)碼生成子類來處理。
創(chuàng)建cglib代理對象
CglibProxy.java(proxy):需要實現MethodInterceptor的intercept方法,并進行反射調用。通過createProxyObject創(chuàng)建真實對象,這里是根據目標對象直接生成對象。
public class CglibProxy implements MethodInterceptor{ /** * CGlib需要代理的目標對象 */ private Object targetObject; public Object createProxyObject(Object targetObject){ this.targetObject = targetObject; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(targetObject.getClass()); enhancer.setCallback(this); Object proxyObj = enhancer.create(); return proxyObj; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { if("operate".equals(method.getName())){ System.out.println("收取管理費用100元"); } return method.invoke(targetObject, objects); }}CGLib代理對象調用
CglibDynamicConsumer.java(client):通過CglibProxy的createProxyObject創(chuàng)建真實目標對象,對進行方法調用
public class CglibDynamicConsumer { public static void main(String[] args) { Store store = (Store)new CglibProxy().createProxyObject(new PersonStore()); store.operate(); store.business(); }}總結
以上是生活随笔為你收集整理的proxy connect abort处理方法_Java代理设计模式(Proxy)的几种具体实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网中c端b端指的是什么意思
- 下一篇: java美元兑换,(Java实现) 美元