導航:首頁 > 程序命令 > 程序員動態代理

程序員動態代理

發布時間:2022-08-27 21:31:55

java靜態代理與動態代理的區別

JAVA的靜態代理與動態代理比較
1.靜態代理類:
程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。動態代理類:在程序運行時,運用反射機制動態創建而成。
由此可見,代理類可以為委託類預處理消息、把消息轉發給委託類和事後處理消息等。
常式1 HelloService.java
package proxy;
import java.util.Date;
public interface HelloService{
public String echo(String msg);
public Date getTime();
}
2.動態代理類
與靜態代理類對照的是動態代理類,動態代理類的位元組碼在程序運行時由Java反射機制動態生成,無需程序員手工編寫它的源代碼。動態代理類不僅簡化了編程工作,而且提高了軟體系統的可擴展性,因為Java 反射機制可以生成任意類型的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。

Proxy類提供了創建動態代理類及其實例的靜態方法。
(1)getProxyClass()靜態方法負責創建動態代理類,它的完整定義如下:
public static Class<?> getProxyClass(ClassLoader loader, Class<?>[] interfaces) throws IllegalArgumentException
參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面。
(2)newProxyInstance()靜態方法負責創建動態代理類的實例,它的完整定義如下:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws
IllegalArgumentException
參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面,參數handler 指定與動態代理類關聯的 InvocationHandler 對象。
以下兩種方式都創建了實現Foo介面的動態代理類的實例:
/**** 方式一 ****/
//創建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);
//創建動態代理類
Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });
//創建動態代理類的實例
Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
/**** 方式二 ****/
//創建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);
//直接創建動態代理類的實例
Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);
由Proxy類的靜態方法創建的動態代理類具有以下特點:
動態代理類是public、final和非抽象類型的;
動態代理類繼承了java.lang.reflect.Proxy類;
動態代理類的名字以「$Proxy」開頭;
動態代理類實現getProxyClass()和newProxyInstance()方法中參數interfaces指定的所有介面;

Ⅱ 程序員簡歷項目經驗怎麼寫好

項目 經驗 是程序員個人簡歷的重要構成部分。以下是我精心推薦的一些程序員簡歷的項目經驗 範文 ,一起來學習下吧!

程序員簡歷的項目經驗範文(一)

項目一:九龍悠久資源管理系統

開發環境:Windows2003 + MyEclipse5.5 + SQLServer2000 + Tomcat6.0

開發技術:Struts + Hibernate + Spring

開發日期:2008年5月—2008年7月

項目描述:系統採用基於J2EE平台的多層架構模式,JSP充分利用Struts框架提供的標簽開發視圖頁面,Struts的Action組件進行流程式控制制,處理業務,使用ORM框架Hibernate實現數據持久化,以面向對象的方式進行系統設計,採用Spring IoC進行業務組件的組裝,系統也更容易維護。商品銷售經營中,經常需要進行商品的入貨、出貨、清點、退貨、結帳等業務,但由於商品品種繁多,業務量大,使用手工方式管理不僅工作量大,而且很容易出現各種失誤,導致工作效率低下。使用本軟體可提高工作效率和管理水平,降低經營成本。

責任描述:主要負責商品銷售和查詢統計:商品銷售主要涉及到銷售和退貨,首先商品銷售需要選取客戶和商品,是從另一個列表頁面讀取的,是通過在頁面編寫javascript腳本語言實現的。也可以輸入商品編碼,頁面會自動填寫商品的基本信息,使用Ajax發送請求完成。輸入銷售數量,則會自動計算金額(應收和未收款),通過javascript實現,保存成功後,根據商品類型和操作時間來生成銷售單號,同時對應商品的庫存量減少。辦理銷售退貨(商品有問題需返回廠家處理):同樣選退貨的客戶,選擇商品或輸入商品編碼,自動填寫商品基本信息(使用Ajax技術)輸入銷售退貨數量,自動計算金額如:應付和未付款(通過javascript實現)。保存成功,自動生成銷售退貨單號,同時對應商品的庫存量增加。查詢統計:主要實現按不同條件查詢商品的入庫及銷售信息,並對某一時間段的銷售情況進行圖表分析,主要使用JFreeChart技術來顯示圖表。

項目二: Naking溧水縣信息管理平台

開發環境: Windows2003 + MyEclipse5.5 + Oracle+ Tomcat6.0

技術描述: Struts2 + Spring2 + Hibernate3 + Ajax + JFreeChart + XFire

開發日期: 2009年3月 — 2009年9月

項目描述:主要就是針對南京溧水縣當地的房地產,建立的一個房地產稅收管理系統,主要有:稅源信息,納稅評估,行政執法,電子檔案,綜合查詢,系統設置,信息變更,地圖管理等模塊構成,稅源信息主要實現稅收管理員對土地、建安、增量房、存量房等交易信息的採集、補充、核實。核實後的信息由稅收管理員進行納稅評估,計算納稅人應該上繳的稅務之後就進入行政執法,對違規的信息進行處理。縣級管理員登錄系統後則可以通過電子檔案和地圖對稅源信息,項目進度和納稅評估進行綜合查詢,對違規的信息進行處理。JSP頁面採用Struts2提供的標簽庫實現數據的顯示和與用戶的交互,通過Struts2的Action進行客戶端與伺服器之間的數據傳輸,採用Hibernate3進行數據的持久化,Spring2的IOC技術則對控制層和模型層進行解耦,同時採用AOP動態代理Hibernate3中的事務處理。

在首頁基於MapEasy技術再度開發了稅收行政區域的地圖,便於更加直觀的對土地和項目進行標注和管理。在頁面中大量的使用了Ajax技術實現頁面與伺服器的無刷新非同步通信,給用戶帶來更加美好的視覺享受。

責任描述:主要負責的是稅源信息採集和納稅評估(建安環節,不動產環節)。以不動產為例介紹:採集不動產交易信息,包括項目基本信息,交易基本信息,納稅人基本信息,選取納稅人和項目信息是通過談出子窗體選取相應的信息,在頁面除了基本的驗證外,使用Ajax技術進行同名檢測,巡查後的信息可補充,核實。核實後的信息有誤可申請信息變更來修改相關的信息,核實是根據不動產交易信息生成不動產樓棟下的房屋平面圖,由此可知,樓棟有幾層,每層的房間數,對這些房可進行增量房交易,記錄(夠房者,夠房金額等),交易後的信息進行維護,征繳(計算納稅人應上繳的稅款)。稅款更新提供手動和自動兩種方式,手動需稅收員手工錄入上繳的稅款,自動更新是通過WebService向另一個交稅系統(實現前台服務納稅人交稅,查詢的功能,為地稅系統提供介面,處理請求)發送請求來提取納稅人交稅信息,避免稅收員重復輸入,提高了工作效率。

程序員簡歷的項目經驗範文(二)

時間:2015.4-2015.5

項目名稱:Ting-Android 音樂播放器

項目簡介:該款 App 界面設計使用的是 Material Design,遵循 Google 設計規范 , 界面開起來清新簡潔,目前 App 只能獲取 Ting 音樂社交網站上用戶分享的前 20 首歌曲 , 以及歌曲評論信息,App 可以在線播放從 Ting 網站上取回來的歌曲,也能播放本地歌曲,播放本地歌曲可以進行隨機播放、循環播放、單曲循環播放,使用到的開源庫有:Picasso、Volley、Gson等.

項目名稱:門窗 DIY 軟體-Android

該款軟體運行環境是安卓手機以及平板電腦,面向的用戶是門廠銷售人員,主要用來為客戶介紹展示門與門框款式,以及讓客戶進行門與門框的搭配並 收藏 起來,同時也能將收藏的搭配刪除 ,該款軟體有些圖片是綁定在安裝包當中的,當安裝完軟體第一次啟動時會把圖片寫入到 SDcard 當中,圖片取出來使用 Picasso 庫對圖片進行緩存處理.

時間:2014.9-2014.12

項目名稱:個人博客網站

該網站前台使用到BootStarp響應式框架,後台服務端主要使用Jsp+Servlet ,實現基本博客網站功能:發 文章 ,閱讀文章,對文章評論,博主管理所有文章,修改密碼,更換頭像.

程序員簡歷的項目經驗範文(三)

OA自動化辦公系統:

軟體環境:Apache Tomcat 5.0/MySQL /windows2003/jdk1.4.2

開發工具:Eclipse,Dreamweaver等開發工具

項目描述:該項目主要針對衡陽市環保局的自動化辦公,提高辦公效率。

1、項目主要採用當前流行的MVC模式,Struts+Hibernate+Spring框架(B/S)。

2、使用的技術: JSP 、Servlet 、JavaBean 、Hibernate、JNDI、XML、Struts、Spring等相關技術。

責任描述:

1、負責技術:相關JavaBean,Servlet,Hibernate持久層的編寫,配置,調試等負責部署整個webapplication。

2、負責功能為個人辦公,包括短消息,通訊錄等。

客戶關系管理系統(CRM)

1.開發環境:Apache Tomcat 5.0/SQLServer/windows2003/jdk1.4.2

2.開發工具:Eclipse ,Dreamweaver等開發工具

3.項目描述:基於J2EE平台,採用MVC設計模式及SSH(Struts+Spring+Hibernate)三個集成框架、B/S模式、SQLServer作為後台資料庫。

4.項目責任:本人主要負責營銷管理模塊及其顯示層的開發。

↓↓↓下一頁更多精彩 程序員簡歷的項目經驗範文 ↓↓↓

Ⅲ java 動態代理怎麼理解

JAVA的靜態代理與動態代理比較
一、概念
代理模式是常用的Java 設計模式,它的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關系,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務。按照代理類的創建時期,代理類可分為兩種。

靜態代理類:
由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。動態代理類:在程序運行時,運用反射機制動態創建而成。

二、靜態代理類
如下, HelloServiceProxy 類是代理類,HelloServiceImpl類是委託類,這兩個類都實現了HelloService介面。其中HelloServiceImpl類是HelloService介面的真正實現者,而HelloServiceProxy類是通過調用HelloServiceImpl 類的相關方法來提供特定服務的。HelloServiceProxy類的echo()方法和getTime()方法會分別調用被代理的HelloServiceImpl 對象的echo()方法和getTime()方法,並且在方法調用前後都會執行一些簡單的列印操作。

由此可見,代理類可以為委託類預處理消息、把消息轉發給委託類和事後處理消息等。

常式1 HelloService.java
package proxy;
import java.util.Date;
public interface HelloService{
public String echo(String msg);
public Date getTime();
}
常式2 HelloServiceImpl.java
package proxy;
import java.util.Date;
public class HelloServiceImpl implements HelloService{
public String echo(String msg){
return "echo:"+msg;
}
public Date getTime(){
return new Date();
}
}
常式3 HelloServiceProxy.java
package proxy;
import java.util.Date;
public class HelloServiceProxy implements HelloService{
private HelloService helloService; //表示被代理的HelloService 實例
public HelloServiceProxy(HelloService helloService){
this.helloService=helloService;
}
public void setHelloServiceProxy(HelloService helloService){
this.helloService=helloService;
}
public String echo(String msg){
System.out.println("before calling echo()"); //預處理
String result=helloService.echo(msg); //調用被代理的HelloService 實例的echo()方法
System.out.println("after calling echo()"); //事後處理
return result;
}
public Date getTime(){
System.out.println("before calling getTime()"); //預處理
Date date=helloService.getTime(); //調用被代理的HelloService 實例的getTime()方法
System.out.println("after calling getTime()"); //事後處理
return date;
}
}
在Client1 類的main()方法中,先創建了一個HelloServiceImpl對象,又創建了一個HelloServiceProxy對象,最後調用HelloServiceProxy對象的echo()方法。
常式4 Client1.java
package proxy;
public class Client1{
public static void main(String args[]){
HelloService helloService=new HelloServiceImpl();
HelloService helloServiceProxy=new HelloServiceProxy(helloService);
System.out.println(helloServiceProxy.echo("hello"));
}
}
運行Client1 類,列印結果如下:
before calling echo()
after calling echo()
echo:hello
常式3 的HelloServiceProxy 類的源代碼是由程序員編寫的,在程序運行前,它的.class文件就已經存在了,這種代理類稱為靜態代理類。

三、動態代理類
與靜態代理類對照的是動態代理類,動態代理類的位元組碼在程序運行時由Java反射機制動態生成,無需程序員手工編寫它的源代碼。動態代理類不僅簡化了編程工作,而且提高了軟體系統的可擴展性,因為Java 反射機制可以生成任意類型的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。

Proxy類提供了創建動態代理類及其實例的靜態方法。
(1)getProxyClass()靜態方法負責創建動態代理類,它的完整定義如下:

public static Class getProxyClass(ClassLoader loader, Class[] interfaces) throws IllegalArgumentException

參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面。

(2)newProxyInstance()靜態方法負責創建動態代理類的實例,它的完整定義如下:

public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler) throws
IllegalArgumentException

參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面,參數handler 指定與動態代理類關聯的 InvocationHandler 對象。

以下兩種方式都創建了實現Foo介面的動態代理類的實例:
/**** 方式一 ****/
//創建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);

//創建動態代理類
Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });

//創建動態代理類的實例
Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });

/**** 方式二 ****/
//創建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);

//直接創建動態代理類的實例
Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);

由Proxy類的靜態方法創建的動態代理類具有以下特點:
動態代理類是public、final和非抽象類型的;
動態代理類繼承了java.lang.reflect.Proxy類;
動態代理類的名字以「$Proxy」開頭;
動態代理類實現getProxyClass()和newProxyInstance()方法中參數interfaces指定的所有介面;

Proxy 類的isProxyClass(Class cl)靜態方法可用來判斷參數指定的類是否為動態代理類。只有通過Proxy類創建的類才是動態代理類;

動態代理類都具有一個public 類型的構造方法,該構造方法有一個InvocationHandler 類型的參數。

由Proxy類的靜態方法創建的動態代理類的實例具有以下特點:
1. 假定變數foo 是一個動態代理類的實例,並且這個動態代理類實現了Foo 介面,那麼「foo instanceof Foo」的值為true。把變數foo強制轉換為Foo類型是合法的:
(Foo) foo //合法

2.每個動態代理類實例都和一個InvocationHandler 實例關聯。Proxy 類的getInvocationHandler(Object proxy)靜態方法返回與參數proxy指定的代理類實例所關聯的InvocationHandler 對象。

3.假定Foo介面有一個amethod()方法,那麼當程序調用動態代理類實例foo的amethod()方法時,該方法會調用與它關聯的InvocationHandler 對象的invoke()方法。

InvocationHandler 介面為方法調用介面,它聲明了負責調用任意一個方法的invoke()方法:
Object invoke(Object proxy,Method method,Object[] args) throws Throwable

參數proxy指定動態代理類實例,參數method指定被調用的方法,參數args 指定向被調用方法傳遞的參數,invoke()方法的返回值表示被調用方法的返回值。

四、最後看一個實例:
HelloServiceProxyFactory 類的getHelloServiceProxy()靜態方法負責創建實現了HelloService介面的動態代理類的實例。

常式5 HelloServiceProxyFactory.java
package proxy;
import java.lang.reflect.*;
public class HelloServiceProxyFactory {
/** 創建一個實現了HelloService 介面的動態代理類的實例
* 參數helloService 引用被代理的HelloService 實例
*/
public static HelloService getHelloServiceProxy(final HelloService helloService){
//創建一個實現了InvocationHandler介面的匿名類的實例
InvocationHandler handler=new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object args[])throws Exception{
System.out.println("before calling "+method); //預處理
Object result=method.invoke(helloService,args);
//調用被代理的HelloService 實例的方法
System.out.println("after calling "+method); //事後處理
return result;
}
};
Class classType=HelloService.class;
return (HelloService)Proxy.newProxyInstance(classType.getClassLoader(),
new Class[]{classType},
handler);
}
}
如下所示的Client2 類先創建了一個HelloServiceImpl 實例,然後創建了一個動態代理類實例helloServiceProxy,最後調用動態代理類實例的echo()方法。
常式6 Client2.java
package proxy;
public class Client2{
public static void main(String args[]){
HelloService helloService=new HelloServiceImpl();
HelloService helloServiceProxy=HelloServiceProxyFactory.getHelloServiceProxy(helloService);
System.out.println("動態代理類的名字為"+helloServiceProxy.getClass().getName());
System.out.println(helloServiceProxy.echo("Hello"));
}
}
運行Client2,列印結果如下:
動態代理類的名字為$Proxy0
before calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String)
after calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String)
echo:Hello
從結果看出,動態代理類的名字為$Proxy0。
PostScript

Ⅳ 什麼是反射技術什麼是靜態代理什麼是動態代理什麼是aop

JAVA的靜態代理與動態代理比較 一、概念 代理模式是常用的Java 設計模式,它的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關系,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務。按照代理類的創建時期,代理類可分為兩種。 靜態代理類: 由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。動態代理類:在程序運行時,運用反射機制動態創建而成。 二、靜態代理類 如下, HelloServiceProxy 類是代理類,HelloServiceImpl類是委託類,這兩個類都實現了HelloService介面。其中HelloServiceImpl類是HelloService介面的真正實現者,而HelloServiceProxy類是通過調用HelloServiceImpl 類的相關方法來提供特定服務的。HelloServiceProxy類的echo()方法和getTime()方法會分別調用被代理的HelloServiceImpl 對象的echo()方法和getTime()方法,並且在方法調用前後都會執行一些簡單的列印操作。 由此可見,代理類可以為委託類預處理消息、把消息轉發給委託類和事後處理消息等。 常式1 HelloService.java package proxy; import java.util.Date; public interface HelloService{ public String echo(String msg); public Date getTime(); } 常式2 HelloServiceImpl.java package proxy; import java.util.Date; public class HelloServiceImpl implements HelloService{ public String echo(String msg){ return "echo:"+msg; } public Date getTime(){ return new Date(); } } 常式3 HelloServiceProxy.java package proxy; import java.util.Date; public class HelloServiceProxy implements HelloService{ private HelloService helloService; //表示被代理的HelloService 實例 public HelloServiceProxy(HelloService helloService){ this.helloService=helloService; } public void setHelloServiceProxy(HelloService helloService){ this.helloService=helloService; } public String echo(String msg){ System.out.println("before calling echo()"); //預處理 String result=helloService.echo(msg); //調用被代理的HelloService 實例的echo()方法 System.out.println("after calling echo()"); //事後處理 return result; } public Date getTime(){ System.out.println("before calling getTime()"); //預處理 Date date=helloService.getTime(); //調用被代理的HelloService 實例的getTime()方法 System.out.println("after calling getTime()"); //事後處理 return date; } } 在Client1 類的main()方法中,先創建了一個HelloServiceImpl對象,又創建了一個HelloServiceProxy對象,最後調用HelloServiceProxy對象的echo()方法。 常式4 Client1.java package proxy; public class Client1{ public static void main(String args[]){ HelloService helloService=new HelloServiceImpl(); HelloService helloServiceProxy=new HelloServiceProxy(helloService); System.out.println(helloServiceProxy.echo("hello")); } } 運行Client1 類,列印結果如下: before calling echo() after calling echo() echo:hello 常式3 的HelloServiceProxy 類的源代碼是由程序員編寫的,在程序運行前,它的.class文件就已經存在了,這種代理類稱為靜態代理類。 三、動態代理類 與靜態代理類對照的是動態代理類,動態代理類的位元組碼在程序運行時由Java反射機制動態生成,無需程序員手工編寫它的源代碼。動態代理類不僅簡化了編程工作,而且提高了軟體系統的可擴展性,因為Java 反射機制可以生成任意類型的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。 Proxy類提供了創建動態代理類及其實例的靜態方法。 (1)getProxyClass()靜態方法負責創建動態代理類,它的完整定義如下: public static Class<?> getProxyClass(ClassLoader loader, Class<?>[] interfaces) throws IllegalArgumentException 參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面。 (2)newProxyInstance()靜態方法負責創建動態代理類的實例,它的完整定義如下: public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException 參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面,參數handler 指定與動態代理類關聯的 InvocationHandler 對象。 以下兩種方式都創建了實現Foo介面的動態代理類的實例: /**** 方式一 ****/ //創建InvocationHandler對象 InvocationHandler handler = new MyInvocationHandler(...); //創建動態代理類 Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class }); //創建動態代理類的實例 Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }). newInstance(new Object[] { handler }); /**** 方式二 ****/ //創建InvocationHandler對象 InvocationHandler handler = new MyInvocationHandler(...); //直接創建動態代理類的實例 Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler); 由Proxy類的靜態方法創建的動態代理類具有以下特點: 動態代理類是public、final和非抽象類型的; 動態代理類繼承了java.lang.reflect.Proxy類; 動態代理類的名字以「$Proxy」開頭; 動態代理類實現getProxyClass()和newProxyInstance()方法中參數interfaces指定的所有介面; Proxy 類的isProxyClass(Class<?> cl)靜態方法可用來判斷參數指定的類是否為動態代理類。只有通過Proxy類創建的類才是動態代理類; 動態代理類都具有一個public 類型的構造方法,該構造方法有一個InvocationHandler 類型的參數。 由Proxy類的靜態方法創建的動態代理類的實例具有以下特點: 1. 假定變數foo 是一個動態代理類的實例,並且這個動態代理類實現了Foo 介面,那麼「foo instanceof Foo」的值為true。把變數foo強制轉換為Foo類型是合法的: (Foo) foo //合法 2.每個動態代理類實例都和一個InvocationHandler 實例關聯。Proxy 類的getInvocationHandler(Object proxy)靜態方法返回與參數proxy指定的代理類實例所關聯的InvocationHandler 對象。 3.假定Foo介面有一個amethod()方法,那麼當程序調用動態代理類實例foo的amethod()方法時,該方法會調用與它關聯的InvocationHandler 對象的invoke()方法。 InvocationHandler 介面為方法調用介面,它聲明了負責調用任意一個方法的invoke()方法: Object invoke(Object proxy,Method method,Object[] args) throws Throwable 參數proxy指定動態代理類實例,參數method指定被調用的方法,參數args 指定向被調用方法傳遞的參數,invoke()方法的返回值表示被調用方法的返回值。 四、最後看一個實例: HelloServiceProxyFactory 類的getHelloServiceProxy()靜態方法負責創建實現了HelloService介面的動態代理類的實例。 常式5 HelloServiceProxyFactory.java package proxy; import java.lang.reflect.*; public class HelloServiceProxyFactory { /** 創建一個實現了HelloService 介面的動態代理類的實例 * 參數helloService 引用被代理的HelloService 實例 */ public static HelloService getHelloServiceProxy(final HelloService helloService){ //創建一個實現了InvocationHandler介面的匿名類的實例 InvocationHandler handler=new InvocationHandler(){ public Object invoke(Object proxy,Method method,Object args[])throws Exception{ System.out.println("before calling "+method); //預處理 Object result=method.invoke(helloService,args); //調用被代理的HelloService 實例的方法 System.out.println("after calling "+method); //事後處理 return result; } }; Class classType=HelloService.class; return (HelloService)Proxy.newProxyInstance(classType.getClassLoader(), new Class[]{classType}, handler); } } 如下所示的Client2 類先創建了一個HelloServiceImpl 實例,然後創建了一個動態代理類實例helloServiceProxy,最後調用動態代理類實例的echo()方法。 常式6 Client2.java package proxy; public class Client2{ public static void main(String args[]){ HelloService helloService=new HelloServiceImpl(); HelloService helloServiceProxy=HelloServiceProxyFactory.getHelloServiceProxy(helloService); System.out.println("動態代理類的名字為"+helloServiceProxy.getClass().getName()); System.out.println(helloServiceProxy.echo("Hello")); } } 運行Client2,列印結果如下: 動態代理類的名字為$Proxy0 before calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String) after calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String) echo:Hello 從結果看出,動態代理類的名字為$Proxy0。

Ⅳ 動態代理和靜態代理的區別

JAVA的靜態代理與動態代理比較
1.靜態代理類:
由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。動態代理類:在程序運行時,運用反射機制動態創建而成。
由此可見,代理類可以為委託類預處理消息、把消息轉發給委託類和事後處理消息等。
常式1 HelloService.java
package proxy;
import java.util.Date;
public interface HelloService{
public String echo(String msg);
public Date getTime();
}
2.動態代理類
與靜態代理類對照的是動態代理類,動態代理類的位元組碼在程序運行時由Java反射機制動態生成,無需程序員手工編寫它的源代碼。動態代理類不僅簡化了編程工作,而且提高了軟體系統的可擴展性,因為Java 反射機制可以生成任意類型的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。

Proxy類提供了創建動態代理類及其實例的靜態方法。
(1)getProxyClass()靜態方法負責創建動態代理類,它的完整定義如下:
public static Class<?> getProxyClass(ClassLoader loader, Class<?>[] interfaces) throws IllegalArgumentException
參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面。
(2)newProxyInstance()靜態方法負責創建動態代理類的實例,它的完整定義如下:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws
IllegalArgumentException
參數loader 指定動態代理類的類載入器,參數interfaces 指定動態代理類需要實現的所有介面,參數handler 指定與動態代理類關聯的 InvocationHandler 對象。
以下兩種方式都創建了實現Foo介面的動態代理類的實例:
/**** 方式一 ****/
//創建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);
//創建動態代理類
Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });
//創建動態代理類的實例
Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
/**** 方式二 ****/
//創建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);
//直接創建動態代理類的實例
Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);
由Proxy類的靜態方法創建的動態代理類具有以下特點:
動態代理類是public、final和非抽象類型的;
動態代理類繼承了java.lang.reflect.Proxy類;
動態代理類的名字以「$Proxy」開頭;
動態代理類實現getProxyClass()和newProxyInstance()方法中參數interfaces指定的所有介面;

Ⅵ java動態代理是什麼

import java.lang.reflect.Proxy;
A. 創建一個實現介面InvocationHandler的類,他必須實現invoke方法
B. 創建被代理的類以及介面。
C. 通過Proxy的靜態方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)創建一個代理
D. 通過代理調用方法。
java動態代理:是在運行是生成的class對象,在生成時必須提供一組或一個interface給它,然後該class就宣稱它實現了這些interface。你當然可以把該class的實例當做這些interface中的任何一個來用,當然,這個DynamicProxy其實就是一個Proxy,他不會替你做實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。因此,DynamicProxy必須實現InvocationHandler介面。
5) 一個動態代理了和一個InvocationHandler 實現關聯的。每一個動態代理實例的調用都要通過InvocationHandler介面的handler(調用處理器)來調用,動態代理不做任何執行操作,只是在創建動態代理時,把要實現的介面和handler關聯,動態代理要幫助被代理執行的任務,要轉交給handler來執行。其實就是調用invoke方法。

Ⅶ 什麼是動態代理

要說動態代理,必須先聊聊靜態代理。

靜態代理

假設現在項目經理有一個需求:在項目現有所有類的方法前後列印日誌。

你如何在不修改已有代碼的前提下,完成這個需求?

我首先想到的是靜態代理。具體做法是:

1.為現有的每一個類都編寫一個對應的代理類,並且讓它實現和目標類相同的介面(假設都有)

2.在創建代理對象時,通過構造器塞入一個目標對象,然後在代理對象的方法內部調用目標對象同名方法,並在調用前後列印日誌。也就是說,代理對象 = 增強代碼 + 目標對象(原對象)。有了代理對象後,就不用原對象了

靜態代理的缺陷

程序員要手動為每一個目標類編寫對應的代理類。如果當前系統已經有成百上千個類,工作量太大了。所以,現在我們的努力方向是:如何少寫或者不寫代理類,卻能完成代理功能?

復習對象的創建

很多初學Java的朋友眼中創建對象的過程

實際上可以換個角度,也說得通

所謂的Class對象,是Class類的實例,而Class類是描述所有類的,比如Person類,Student類

可以看出,要創建一個實例,最關鍵的就是得到對應的Class對象。只不過對於初學者來說,new這個關鍵字配合構造方法,實在太好用了,底層隱藏了太多細節,一句 Person p = new Person();直接把對象返回給你了。我自己剛開始學Java時,也沒意識到Class對象的存在。

分析到這里,貌似有了思路:

能否不寫代理類,而直接得到代理Class對象,然後根據它創建代理實例(反射)。

Class對象包含了一個類的所有信息,比如構造器、方法、欄位等。如果我們不寫代理類,這些信息從哪獲取呢?苦思冥想,突然靈光一現:代理類和目標類理應實現同一組介面。之所以實現相同介面,是為了盡可能保證代理對象的內部結構和目標對象一致,這樣我們對代理對象的操作最終都可以轉移到目標對象身上,代理對象只需專注於增強代碼的編寫。還是上面這幅圖:

所以,可以這樣說:介面擁有代理對象和目標對象共同的類信息。所以,我們可以從介面那得到理應由代理類提供的信息。但是別忘了,介面是無法創建對象的,怎麼辦?

動態代理

JDK提供了java.lang.reflect.InvocationHandler介面和 java.lang.reflect.Proxy類,這兩個類相互配合,入口是Proxy,所以我們先聊它。

Proxy有個靜態方法:getProxyClass(ClassLoader, interfaces),只要你給它傳入類載入器和一組介面,它就給你返回代理Class對象。

用通俗的話說,getProxyClass()這個方法,會從你傳入的介面Class中,「拷貝」類結構信息到一個新的Class對象中,但新的Class對象帶有構造器,是可以創建對象的。打個比方,一個大內太監(介面Class),空有一身武藝(類信息),但是無法傳給後人。現在江湖上有個妙手神醫(Proxy類),發明了克隆大法(getProxyClass),不僅能克隆太監的一身武藝,還保留了小DD(構造器)...(這到底是道德の淪喪,還是人性的扭曲,歡迎走進動態代理)

所以,一旦我們明確介面,完全可以通過介面的Class對象,創建一個代理Class,通過代理Class即可創建代理對象。

大體思路

靜態代理

動態代理
所以,按我理解,Proxy.getProxyClass()這個方法的本質就是:以Class造Class。

有了Class對象,就很好辦了,具體看代碼:

完美。

根據代理Class的構造器創建對象時,需要傳入InvocationHandler。每次調用代理對象的方法,最終都會調用InvocationHandler的invoke()方法:

怎麼做到的呢?

上面不是說了嗎,根據代理Class的構造器創建對象時,需要傳入InvocationHandler。通過構造器傳入一個引用,那麼必然有個成員變數去接收。沒錯,代理對象的內部確實有個成員變數invocationHandler,而且代理對象的每個方法內部都會調用handler.invoke()!InvocationHandler對象成了代理對象和目標對象的橋梁,不像靜態代理這么直接。

大家仔細看上圖右側的動態代理,我在invocationHandler的invoke()方法中並沒有寫目標對象。因為一開始invocationHandler的invoke()里確實沒有目標對象,需要我們手動new

Ⅷ java 我不理解動態代理的意義

人家是動態編程,需要在原來的方法的功能基礎上再添加一些功能,而不用改變這個方法的簽名,原來調用這個方法的類依然能正常工作。

比如,現在要把一段文本發送給另一個人,普通方法是 void send(File a),現在我們弄出個特性,就像 Spring AOP 那樣,在 send 之前給這個 a 壓縮一下。原來的程序沒有壓縮功能,現在我們需要添加的話而不改變原來所有的代碼的話就得用類似 AOP 這樣的代碼來處理。

一般一個無法再繼承的類和方法,要用代理,而能夠繼承的類和方法可以在內在中直接生成一個新的 java 類繼承它然後覆蓋掉那個 send 方法,像 hibernate/spring/jboss 都把這些自動完成了。
而像 AspectJ 這種 AOP 剛不同,它直接把人家的 class 代碼修改了,它就不需要使用代理。

這些在新的 JDK 6 中都可以通過 Instrument 來做到,不過也是個通用的方法,還得通過規則來定製什麼情況下處理,什麼時候不處理。

Ⅸ jdk動態代理和cgli代理的區別

當一個對象(客戶端)不能或者不想直接引用另一個對象(目標對象),這時可以應用代理模式在這兩者之間構建一個橋梁--代理對象。按照代理對象的創建時期不同,可以分為兩種:
靜態代理:程序員事先寫好代理對象類,在程序發布前就已經存在了;
動態代理:應用程序發布後,通過動態創建代理對象。
其中動態代理又可分為:
1.JDK動態代理
此時代理對象和目標對象實現了相同的介面,目標對象作為代理對象的一個屬性,具體介面實現中,可以在調用目標對象相應方法前後加上其他業務處理邏輯。
代理模式在實際使用時需要指定具體的目標對象,如果為每個類都添加一個代理類的話,會導致類很多,同時如果不知道具體類的話,怎樣實現代理模式呢?這就引出動態代理。
JDK動態代理只能針對實現了介面的類生成代理。
2.CGLIB代理
CGLIB(CODE GENERLIZE LIBRARY)代理是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的所有方法,所以該類或方法不能聲明稱final的。

閱讀全文

與程序員動態代理相關的資料

熱點內容
用python自製編譯器 瀏覽:950
android分享新浪微博客戶端 瀏覽:26
系統中伺服器在哪裡下載地址 瀏覽:1001
新a4安卓手機怎麼投屏 瀏覽:169
pdftoemf 瀏覽:886
java介面可以實現介面嗎 瀏覽:59
vb編程10個隨機函數 瀏覽:21
程序員個人簡介100 瀏覽:772
土木工程師演算法工程師 瀏覽:92
javaexcel導入oracle 瀏覽:880
如何設置異地伺服器 瀏覽:882
為什麼安卓手機藍牙耳機不會彈窗 瀏覽:546
linuxf77編譯器安裝教程 瀏覽:949
android本地錄音許可權 瀏覽:446
加密u盤內容怎麼拷貝 瀏覽:283
安卓手機為什麼看不到iso文件 瀏覽:582
用圖片做文件夾圖標 瀏覽:693
java正則表達式語法 瀏覽:865
美圖秀在線壓縮圖片 瀏覽:184
蘋果自帶控制app是什麼 瀏覽:909