導航:首頁 > 編程語言 > 切面編程拋出異常

切面編程拋出異常

發布時間:2024-10-26 09:34:09

㈠ 使用java語言,如何對一個類中的靜態方法做切面編程

packagecom.classloader.test;

importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.lang.reflect.Modifier;

{

privateCallBackcallBack;

publicAOPCallStaticMehtod(CallBackcallBack){
this.callBack=callBack;
}

publicstaticinterfaceCallBack{
voidbefore(Methodmethod);

voidafter(Methodmethod,Objectresult);
}

@SuppressWarnings({"unchecked","rawtypes"})
publicObjectcallMethod(Classclazz,StringmethodName,Class[]parameterTypes,Object[]parameters){
Objectresult=null;
try{
Methodmethod=null;
if(parameterTypes==null||parameterTypes.length==0){
method=clazz.getMethod(methodName);
if(Modifier.isStatic(method.getModifiers())){
callBack.before(method);
result=method.invoke(null);
callBack.after(method,result);
}else{
System.out.println("這不是一個靜態方法");
}
}else{
method=clazz.getMethod(methodName,parameterTypes);
if(Modifier.isStatic(method.getModifiers())){
callBack.before(method);
result=method.invoke(null,parameters);
callBack.after(method,裂亮result);
}else{
System.out.println("這不是一個靜態方法");
}
}
}catch(NoSuchMethodException|SecurityException|IllegalAccessException|IllegalArgumentException
|InvocationTargetExceptione){
if()肆消寬{
System.out.println("沒有這個方法");
}else{
System.out.println("calliserror!");
}
}
returnresult;
}

publicstaticvoidmain(String[]args){
CallBackcallBack=newCallBack(){

@Override
publicvoidbefore(Methodmethod){
if(method.getName().equals("test1")||method.getName().equals("test2")){
System.out.println(method.getName()+"方法在調用之前被攔橋大截,可以在這里切面編程");
}
}

@Override
publicvoidafter(Methodmethod,Objectresult){
if(method.getName().equals("test1")||method.getName().equals("test2")){
System.out.println(method.getName()+"方法調用以後被攔截,可以在這里切面編程");
System.out.println(method.getName()+"執行結果是:"+result);
System.out.println("-----------------------------------------");
}
}

};
=newAOPCallStaticMehtod(callBack);
AOPCallStaticMehtod.callMethod(Test.class,"test1",newClass[]{String.class},newObject[]{"ppppppppppp"});
AOPCallStaticMehtod.callMethod(Test.class,"test2",null,null);
}
}

classTest{
publicstaticvoidtest1(Stringaa){
System.out.println(aa);
}
publicstaticStringtest2(){
System.out.println("fffffffffffffffff");
return"test2result";
}
}

㈡ Java編程中的AOP和IOC分別是什麼呢,什麼時候用呢

控制反轉(IOC)


(理解好Ioc的關鍵是要明確「誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了」)

1、Ioc—Inversion of Control:即「控制反轉」,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。

2、誰控制誰,控制什麼:傳統Java SE程序設計,我們直接在對象內部通過new進行創建對象,是程序主動去創建依賴對象;而IoC是有專門一個容器來創建這些對象即由Ioc容器來控制對象的創建。

誰控制誰?當然是IoC 容器控制了對象。

控制什麼?那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。

3、為何是反轉,哪些方面反轉了: 有反轉就有正轉,傳統應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙創建及注入依賴對象。

為何是反轉?因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象,所以是反轉。

哪些方面反轉了?依賴對象的獲取被反轉了。

還是不明白沒事,下面搞個簡單案例來說就懂啦 !!!

例子:當我們在任何一個有實際開發意義的程序項目中,我們會使用很多類來描述他們特有的功能,並且通過類與類之間的相互協作來完成特定的業務邏輯。這個時候,每個類都需要負責管理與自己有交互的類的引用和依賴,代碼將會變的異常難以維護和極高的高耦合。而IOC的出現正是用來解決這個問題,我們通過IOC將這些依賴對象的創建、協調工作交給spring容器去處理,每個對象值需要關注其自身的業務邏輯關系就可以了。在這樣的角度上來看,獲得依賴的對象的方式,進行了反轉,變成了由spring容器控制對象如何獲取外部資源(包括其他對象和文件資料等)。

總的來說:IOC就是通過在Xml配置文件里依賴注入來解決代碼問題。

IOC的注入類型有幾種?主要可以劃分為三種:構造函數注入、屬性注入和介面注入。Spring支持構造函數注入和屬性注入

面向切面(AOP)


(面向切面編程,AOP其實只是OOP的補充而已,AOP基本上是通過代理機制實現的。)

我們管切入到指定類指定方法的代碼片段稱為切面,而切入到哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時再切入對象中去,從而改變其原有的行為。

我們都知道 Java 是 OOP-面向對象編程的,它有自己的優勢,也有自己的不足。比如說:在我們開發中,都會有一條業務主線(即客戶的需求)。而我們要做的就是實現這個主線上的需求。我們在實現這些功能的時候,經常要干一些額外的不可避免的事情,比如事務的管理,日誌的記錄等,就很繁雜且代碼量增多,所以 Spring 提供了另一種角度來思考程序結構,也就是把這一些事情剝離出來,然後適時適地的把它們加入到我們的代碼中,比如說 聲明式事務管理的時候,我們在 service 層檢測到save*、update*這些方法要被調用的時候,我們先進行開啟事務什麼的,這就是AOP,面向編程的思想。

AOP的術語:

1、通知(Advice):就是你想要的功能,也就是上面說的 安全,事物,日誌等。你給先定義好把,然後在想用的地方用一下

2、連接點(JoinPoint):這個更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個方法的前,後(兩者都有也行),或拋出異常時都可以是連接點,spring只支持方法連接點.其他如aspectJ還可以讓你在構造器或屬性注入時都行,不過那不是咱關注的,只要記住,和方法有關的前前後後(拋出異常),都是連接點。

3、切入點(Pointcut):上面說的連接點的基礎上,來定義切入點,你的一個類里,有15個方法,那就有幾十個連接點了對把,但是你並不想在所有方法附近都使用通知(使用叫織入,以後再說),你只想讓其中的幾個,在調用這幾個方法之前,之後或者拋出異常時干點什麼,那麼就用切點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。

4、切面(Aspect):切面是通知和切入點的結合。現在發現了吧,沒連接點什麼事情,連接點就是為了讓你好理解切點,搞出來的,明白這個概念就行了。通知說明了干什麼和什麼時候干(什麼時候通過方法名中的before,after,around等就能知道),而切入點說明了在哪干(指定到底是哪個方法),這就是一個完整的切面定義。

5、引入(introction):允許我們向現有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎

6、目標(target):引入中所提到的目標類,也就是要被通知的對象,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注於業務本身的邏輯。

7、代理(proxy):怎麼實現整套aop機制的,都是通過代理,這個一會給細說。

8、織入(weaving):把切面應用到目標對象來創建新的代理對象的過程。有3種方式,spring採用的是運行時,為什麼是運行時,後面解釋。

閱讀全文

與切面編程拋出異常相關的資料

熱點內容
惠利app是什麼 瀏覽:779
游戲埠讀取伺服器失敗怎麼弄 瀏覽:878
linux修復mbr 瀏覽:128
磁碟格式化基本命令 瀏覽:578
程序員掉入異世界 瀏覽:954
andlua畫質助手源碼 瀏覽:577
winrar解壓格式怎麼看 瀏覽:147
qt編程入門pdf 瀏覽:599
php中是根據指針查的數據嗎 瀏覽:276
安卓手機驅動為什麼不能提取通用 瀏覽:708
轉行程序員失敗的人 瀏覽:728
延遲命令方塊 瀏覽:499
某視頻網站為什麼安卓可以投屏 瀏覽:651
伺服器解釋器在哪個文件夾 瀏覽:95
app督促服務在哪裡 瀏覽:992
命令與征服3語音 瀏覽:999
用紙片和怎麼才能做一個解壓球 瀏覽:476
vim顯示命令 瀏覽:294
程序員給老婆送手機 瀏覽:84
胖子程序員視頻 瀏覽:142