程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 非常鐘懂得Java中的靜態署理

非常鐘懂得Java中的靜態署理

編輯:關於JAVA

非常鐘懂得Java中的靜態署理。本站提示廣大學習愛好者:(非常鐘懂得Java中的靜態署理)文章只能為提供參考,不一定能成為您想要的結果。以下是非常鐘懂得Java中的靜態署理正文


若署理類在法式運轉前就曾經存在,那末這類署理方法被成為 靜態署理 ,這類情形下的署理類平日都是我們在Java代碼中界說的。 平日情形下, 靜態署理中的署理類和拜托類會完成統一接口或是派生自雷同的父類。

1、概述
1. 甚麼是署理
我們年夜家都曉得微商朝理,簡略地說就是取代廠家賣商品,廠家“拜托”署理為其發賣商品。關於微商朝理,起首我們從他們那邊買器械時平日不曉得面前的廠家畢竟是誰,也就是說,“拜托者”對我們來講是弗成見的;其次,微商朝理重要以同伙圈的工資目的客戶,這就相當於為廠家做了一次對客戶群體的“過濾”。我們把微商朝理和廠家進一步籠統,前者可籠統為署理類,後者可籠統為拜托類(被署理類)。經由過程應用署理,平日有兩個長處,而且可以或許分離與我們提到的微商朝理的兩個特色對應起來:
長處一:可以隱蔽拜托類的完成;
長處二:可以完成客戶與拜托類間的解耦,在不修正拜托類代碼的情形下可以或許做一些額定的處置。
2. 靜態署理
若署理類在法式運轉前就曾經存在,那末這類署理方法被成為 靜態署理 ,這類情形下的署理類平日都是我們在Java代碼中界說的。 平日情形下, 靜態署理中的署理類和拜托類會完成統一接口或是派生自雷同的父類。 上面我們用Vendor類代表臨盆廠家,BusinessAgent類代表微商朝理,來引見下靜態署理的簡略完成,拜托類和署理類都完成了Sell接口,Sell接口的界說以下:

public interface Sell { void sell(); void ad(); 
 
} 
Vendor類的界說以下:
public class Vendor implements Sell { public void sell() { 
 
System.out.println("In sell method"); 
 
} public void ad() { 
 
System,out.println("ad method") 
 
} 
 
} 

署理類BusinessAgent的界說以下:

public class Vendor implements Sell { public void sell() { 
 
System.out.println("In sell method"); 
 
} public void ad() { 
 
System,out.println("ad method") 
 
} 
 
} 

從BusinessAgent類的界說我們可以懂得到,靜態署理可以經由過程聚合來完成,讓署理類持有一個拜托類的援用便可。
上面我們斟酌一下這個需求:給Vendor類增長一個過濾功效,只賣貨給年夜先生。經由過程靜態署理,我們無需修正Vendor類的代碼便可以完成,只需在BusinessAgent類中的sell辦法中添加一個斷定便可以下所示:

public class BusinessAgent implements Sell { 
 
... 
 
public void sell() { 
 
if (isCollegeStudent()) { 
 
vendor.sell(); 
 
} 
 
} 
 
... 
 
} 

這對應著我們下面提到的應用署理的第二個長處:可以完成客戶與拜托類間的解耦,在不修正拜托類代碼的情形下可以或許做一些額定的處置。靜態署理的局限在於運轉前必需編寫好署理類,上面我們重點來引見下運轉時生成署理類的靜態署理方法。

2、靜態署理
1. 甚麼是靜態署理
署理類在法式運轉時創立的署理方法被成為 靜態署理。 也就是說,這類情形下,署理類其實不是在Java代碼中界說的,而是在運轉時依據我們在Java代碼中的“指導”靜態生成的。比擬於靜態署理, 靜態署理的優勢在於可以很便利的對署理類的函數停止同一的處置,而不消修正每一個署理類的函數。 這麼說比擬籠統,上面我們聯合一個實例來引見一下靜態署理的這個優勢是怎樣表現的。
如今,假定我們要完成如許一個需求:在履行拜托類中的辦法之前輸入“before”,在履行終了後輸入“after”。我們照樣以下面例子中的Vendor類作為拜托類,BusinessAgent類作為署理類來停止引見。起首我們來應用靜態署理來完成這一需求,相干代碼以下:

public class BusinessAgent implements Sell { 
 
private Vendor mVendor; 
 
public BusinessAgent(Vendor vendor) { 
 
this.mVendor = vendor; 
 
} 
 
public void sell() { 
 
System.out.println("before"); 
 
mVendor.sell(); 
 
System.out.println("after"); 
 
} 
 
public void ad() { 
 
System.out.println("before"); 
 
mVendor.ad(); 
 
System.out.println("after"); 
 
} 
 
} 

從以上代碼中我們可以懂得到,經由過程靜態署理完成我們的需求須要我們在每一個辦法中都添加響應的邏輯,這裡只存在兩個辦法所以任務量還不算年夜,假設Sell接口中包括上百個辦法呢?這時候候應用靜態署理就會編寫很多冗余代碼。經由過程應用靜態署理,我們可以做一個“同一指導”,從而對一切署理類的辦法停止同一處置,而不消一一修正每一個辦法。上面我們來詳細引見下若何應用靜態署理方法完成我們的需求。
2. 應用靜態署理
(1)InvocationHandler接口
在應用靜態署理時,我們須要界說一個位於署理類與拜托類之間的中介類,這個中介類被請求完成InvocationHandler接口,這個接口的界說以下:

public interface InvocationHandler { 
 
Object invoke(Object proxy, Method method, Object[] args); 
 
} 

從InvocationHandler這個稱號我們便可以曉得,完成了這個接口的中介類用做“挪用處置器”。當我們挪用署理類對象的辦法時,這個“挪用”會轉送到invoke辦法中,署理類對象作為proxy參數傳入,參數method標識了我們詳細挪用的是署理類的哪一個辦法,args為這個辦法的參數。如許一來,我們對署理類中的一切辦法的挪用都邑變成對invoke的挪用,如許我們可以在invoke辦法中添加同一的處置邏輯(也能夠依據method參數對分歧的署理類辦法做分歧的處置)。是以我們只需在中介類的invoke辦法完成中輸入“before”,然後挪用拜托類的invoke辦法,再輸入“after”。上面我們來一步一步詳細完成它。
(2)拜托類的界說
靜態署理方法下,請求拜托類必需完成某個接口,這裡我們完成的是Sell接口。拜托類Vendor類的界說以下:

public class Vendor implements Sell { 
 
public void sell() { 
 
System.out.println("In sell method"); 
 
} 
 
public void ad() { 
 
System,out.println("ad method") 
 
} 
 
} 

(3)中介類
下面我們提到過,中介類必需完成InvocationHandler接口,作為挪用處置器”攔阻“對署理類辦法的挪用。中介類的界說以下:

public class DynamicProxy implements InvocationHandler { 
 
private Object obj; //obj為拜托類對象; 
 
public DynamicProxy(Object obj) { 
 
this.obj = obj; 
 
} 
 
@Override 
 
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
 
System.out.println("before"); 
 
Object result = method.invoke(obj, args); 
 
System.out.println("after"); 
 
return result; 
 
} 
 
} 

從以上代碼中我們可以看到,中介類持有一個拜托類對象援用,在invoke辦法中挪用了拜托類對象的響應辦法(第11行),看到這裡是否是認為素昧平生?經由過程聚合方法持有拜托類對象援用,把內部對invoke的挪用終究都轉為對拜托類對象的挪用。這不就是我們下面引見的靜態署理的一種完成方法嗎?現實上,中介類與拜托類組成了靜態署理關系,在這個關系中,中介類是署理類,拜托類就是拜托類; 署理類與中介類也組成一個靜態署理關系,在這個關系中,中介類是拜托類,署理類是署理類。也就是說,靜態署理關系由兩組靜態署理關系構成,這就是靜態署理的道理。上面我們來引見一下若何”指導“以靜態生成署理類。
(4)靜態生成署理類
靜態生成署理類的相干代碼以下:

public class Main { 
 
public static void main(String[] args) { 
 
//創立中介類實例 
 
DynamicProxy inter = new DynamicProxy(new Vendor()); 
 
//加上這句將會發生一個$Proxy0.class文件,這個文件即為靜態生成的署理類文件 
 
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true"); 
 
//獲得署理類實例sell 
 
Sell sell = (Sell)(Proxy.newProxyInstance(Sell.class.getClassLoader(), new Class[] {Sell.class}, inter)); 
 
//經由過程署理類對象挪用署理類辦法,現實上會轉到invoke辦法挪用 
 
sell.sell(); 
 
sell.ad(); 
 
} 
 
} 

在以上代碼中,我們挪用Proxy類的newProxyInstance辦法來獲得一個署理類實例。這個署理類完成了我們指定的接口而且會把辦法挪用分發到指定的挪用處置器。這個辦法的聲明以下:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
辦法的三個參數寄義分離以下:
loader:界說了署理類的ClassLoder;
interfaces:署理類完成的接口列表
h:挪用處置器,也就是我們下面界說的完成了InvocationHandler接口的類實例
我們運轉一下,看看我們的靜態署理能否能正常任務。我這裡運轉後的輸入為:

解釋我們的靜態署理確切見效了。
下面我們曾經簡略提到過靜態署理的道理,這裡再簡略的總結下:起首經由過程newProxyInstance辦法獲得署理類實例,爾後我們即可以經由過程這個署理類實例挪用署理類的辦法,對署理類的辦法的挪用現實上都邑挪用中介類(挪用處置器)的invoke辦法,在invoke辦法中我們挪用拜托類的響應辦法,而且可以添加本身的處置邏輯。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved