導航:首頁 > 代理服務 > 面試動態代理有哪些

面試動態代理有哪些

發布時間:2023-08-04 14:23:40

① spring的動態代理有幾種實現方式

JAVA 代理實現

代理的實現分動態代理和靜態代理,靜態代理的實現是對已經生成了的JAVA類進行封裝。

動態代理則是在運行時生成了相關代理累,在JAVA中生成動態代理一般有兩種方式。


JDK自帶實現方法

JDK實現代理生成,是用類 java.lang.reflect.Proxy, 實現方式如下

EX:

publicclassJDKProxy{
(finalObjectc){
returnProxy.newProxyInstance(c.getClass().getClassLoader(),c.getClass().getInterfaces(),//JDK實現動態代理,但JDK實現必須需要介面
newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
//TODOAuto-generatedmethodstub
ObjectreObj=null;
System.out.print("yousay:");
reObj=method.invoke(c,args);
System.out.println("["+Calendar.getInstance().get(Calendar.HOUR)+":"
+Calendar.getInstance().get(Calendar.MINUTE)+""
+Calendar.getInstance().get(Calendar.SECOND)+"]");
returnreObj;
}
});
}
}

測試代理類方法

publicclassTestForPoxy{
publicstaticvoidmain(String[]args){
ServiceTestservice=newServiceTestImpl();
System.out.println(service.getClass().getSimpleName());
ServiceTestpoxyService=(ServiceTest)JDKProxy.getPoxyObject(service);
System.out.println(poxyService.getClass().getSuperclass());
poxyService.saySomething("hello,MyQQcodeis107966750.");
poxyService.saySomething("what'syourname?");
poxyService.saySomething("onlyfortest,hehe.");
}
}

1, Proxy實現代理的目標類必須有實現介面

2, 生成出來的代理類為介面實現類,和目標類不能進行轉換,只能轉為介面實現類進行調用

明顯特點:通過此方法生成出來的類名叫做 $Proxy0


用CGLIB包實現

CGLIB是一個開源項目,官方網址是:http://cglib.sourceforge.net/,可以去上面下載最新JAR包,

本項目用的是cglib-3.0.jar

本項目還加入了依賴JAR包asm-4.0.jar,asm-util-4.0.jar

實現方式如下

EX:

publicclassCGLIBProxy{
(Objectc){
Enhancerenhancer=newEnhancer();
enhancer.setSuperclass(c.getClass());
enhancer.setCallback(newMethodInterceptor(){
publicObjectintercept(Objectarg0,Methodarg1,Object[]arg2,MethodProxyproxy)throwsThrowable{
System.out.print("yousay:");
proxy.invokeSuper(arg0,arg2);
System.out.println("["+Calendar.getInstance().get(Calendar.HOUR)+":"
+Calendar.getInstance().get(Calendar.MINUTE)+""+Calendar.getInstance().get(Calendar.SECOND)
+"]");
returnnull;
}
});
returnenhancer.create();
}
}

測試代理類方法

publicclassTestForPoxy{
publicstaticvoidmain(String[]args){
ServiceTestservice=newServiceTestImpl();
System.out.println(service.getClass().getSimpleName());
//ServiceTestpoxyService=(ServiceTest)JDKProxy.getPoxyObject(service);
ServiceTestpoxyService=(ServiceTest)CGLIBProxy.getPoxyObject(service);
System.out.println(poxyService.getClass().getSuperclass());
poxyService.saySomething("hello,MyQQcodeis107966750.");
poxyService.saySomething("what'syourname?");
poxyService.saySomething("onlyfortest,hehe.");
}
}

1, CGLIB實現方式是對代理的目標類進行繼承

2, 生成出了的代理類可以沒方法,生成出來的類可以直接轉換成目標類或目標類實現介面的實現類,因JAVA向上轉換

明顯特點:通過輸出看出,看出生成出的代理類的parent類為代理的目標類

② 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方法。

③ 京東面試題 java 動態代理主要怎麼實現的

在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對介面的的實現。

其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler介面。

Proxy
類主要用來獲取動態代理對象,InvocationHandler介面用來約束調用者實現,如下,HelloWorld介面定義的業務方
法,HelloWorldImpl是HelloWorld介面的實現,HelloWorldHandler是InvocationHandler介面實
現。代碼如下:

業務介面:

public interface HelloWorld {

void sayHelloWorld() ;

}

業務介面實現:

public class HelloWorldImpl implements HelloWorld {

public void sayHelloWorld() {

System.out.println("Hello World!");

}

}

InvocationHandler實現,需要在介面方法調用前後加入一部份處理工作,這里僅僅在方法調用前後向後台輸出兩句字元串,其代碼如下:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

//要代理的原始對象

private Object objOriginal;

/**

* 構造函數。

* @param obj 要代理的原始對象。

*/

public HelloWorldHandler(Object obj) {

this.objOriginal = obj ;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result ;

//方法調用之前

doBefore();

//調用原始對象的方法

result = method.invoke(this.objOriginal ,args);

//方法調用之後

doAfter();

return result ;

}

private void doBefore() {

System.out.println("before method invoke!");

}

private void doAfter() {

System.out.println("after method invoke!");

}

}

測試代碼:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {

HelloWorld hw = new HelloWorldImpl();

InvocationHandler handler = new HelloWorldHandler(hw);

HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

hw.getClass().getClassLoader(),

hw.getClass().getInterfaces(),

handler);

proxy.sayHelloWorld();

}

}

?? 首先獲取一個業務介面的實現對象;

?? 獲取一個InvocationHandler實現,此處是HelloWorldHandler對象;

?? 創建動態代理對象;

?? 通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前後輸出兩句字元串。

運行測試類輸出如下:

before method invoke!

Hello World!

after method invoke!

此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP

④ jdk動態代理與cglib動態代理有什麼區別

此時代理對象和目標對象實現了相同的介面,目標對象作為代理對象的一個屬性,具體介面實現中,可以在調用目標對象相應方法前後加上其他業務處理邏輯。

代理模式在實際使用時需要指定具體的目標對象,如果為每個類都添加一個代理類的話,會導致類很多,同時如果不知道具體類的話,怎樣實現代理模式呢?這就引出動態代理。

JDK動態代理只能針對實現了介面的類生成代理。

CGLIB(CODE GENERLIZE LIBRARY)代理是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的所有方法,所以該類或方法不能聲明稱final的。

如果目標對象沒有實現介面,則默認會採用CGLIB代理;

如果目標對象實現了介面,可以強制使用CGLIB實現代理(添加CGLIB庫,並在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。


AOP包括切面(aspect)、通知(advice)、連接點(joinpoint),實現方式就是通過對目標對象的代理在連接點前後加入通知,完成統一的切面操作。

閱讀全文

與面試動態代理有哪些相關的資料

熱點內容
換季產品怎麼玩 瀏覽:904
南充有哪些鄉土菜市場 瀏覽:482
神州買買車代理費多少 瀏覽:993
夜遊產品體系如何構建 瀏覽:142
怎麼讓公司的產品入駐自營超市 瀏覽:497
有什麼祛痘印好的產品 瀏覽:67
刷臉支付技術在哪裡 瀏覽:839
企業年審里的即時信息怎麼填 瀏覽:381
消防產品公司如何管理物料 瀏覽:98
三無產品索賠依據是什麼 瀏覽:202
期貨開戶用哪個交易所 瀏覽:107
如何打開施耐德程序 瀏覽:965
為什麼要解析串口數據 瀏覽:757
本月收入數據填錯怎麼辦 瀏覽:950
怎麼修改疫情數據可視化的格式 瀏覽:799
北京賣狗的市場在哪裡 瀏覽:826
平安的理財產品有哪些 瀏覽:129
現代產業技術創新包含什麼 瀏覽:22
邢台滴滴市場到底怎麼樣 瀏覽:689
如何完善汽車信息 瀏覽:169