何為動態署理?
在程式運轉期,創立目標目標的署理目標,對目標目標中的辦法進行功用性增強的一種技術;它便是JVM中,目標辦法的阻攔器
writelessdomore!!
回顧OOP(面向目標編程)
三大特征:封裝、承繼和多型比如說,有Dog類、Cat類、Horse類,它們都有eat辦法,run辦法,依照OOP的編程思維,那么咱們能夠抽象出父類Animal,在父類中放置相同的特點或者辦法,這樣來防止多子類中重復的代碼,一切皆目標,很牛逼了,其實它有缺點!
OOP是縱向抽取和承繼體系,OOP許多場合都能夠處理咱們的問題【代碼重復問題】,但是有一些場合,也有它處理不了的需求被處理的很多的代碼重復問題,
1.1什么是動態署理?
==動態署理便是,在程式運轉期,創立目標目標的署理目標,并對目標目標中的辦法進行功用性增強的一種技術==,在生成署理目標的程序中,目標目標不變,署理目標中的辦法是目標目標辦法的增強辦法,能夠理解為運轉期間,目標中辦法的動態阻攔,在阻攔辦法的前后履行功用操作,
署理類在程式運轉期間,創立的署理目標稱之為動態署理目標,這種情況下,創立的署理目標,并不是事先在Java代碼中界說好的,而是在運轉期間,依據咱們在動態署理目標中的“指示”,動態生成的,也便是說,你想獲取哪個目標的署理,動態署理就會為你動態的生成這個目標的署理目標,動態署理能夠對被署理目標的辦法進行功用增強,有了動態署理的技術,那么就能夠在不修正辦法原始碼的情況下,增強被署理目標的辦法的功用,在辦法履行前后做任何你想做的作業,
創立署理目標的兩個辦法:
//JDK動態署理
Proxy.newProxyInstance(三個引數);
//CGLib動態署理
Enhancer.create(兩個引數);
正常類創立目標的程序:
動態署理創立署理目標的程序:
1.2兩種常用的動態署理辦法
根據介面的動態署理提供者:JDK運用JDK官方的Proxy類創立署理目標留意:署理的目標目標有必要完成介面根據類的動態署理提供者:第三方CGLib運用CGLib的Enhancer類創立署理目標留意:如果報asmxxxx反常,需求匯入asm.jar包publicclassLogProxy{
/**
*生成目標的署理目標,對被署理目標進行一切辦法日志增強
*引數:原始目標
*回傳值:被署理的目標
*JDK動態署理
*根據介面的動態署理
*被署理類有必要完成介面
*JDK提供的
*/
publicstaticObjectgetObject(finalObjectobj){
/**
*創立目標的署理目標
*引數一:類加載器
*引數二:目標的介面
*引數三:呼叫處理器,署理目標中的辦法被呼叫,都會在履行辦法,對一切被署理目標的辦法進行阻攔
*/
ObjectproxyInstance=Proxy.newProxyInstance(obj.getClass().getClassLoader()
,obj.getClass().getInterfaces(),newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
//辦法履行前
longstartTime=System.currentTimeMillis();
Objectresult=method.invoke(obj,args);//履行辦法的呼叫
//辦法履行后
longendTime=System.currentTimeMillis();
SimpleDateFormatsdf=newSimpleDateFormat();
System.out.printf(String.format("%s辦法履行結束時間:%%s;辦法履行耗時:%%d%%n"
,method.getName()),sdf.format(endTime),endTime-startTime);
returnresult;
}
});
returnproxyInstance;
}
/**
*運用CGLib創立動態署理目標
*第三方提供的的創立署理目標的辦法CGLib
*被署理目標不能用final修飾
*運用的是Enhancer類創立署理目標
*/
publicstaticObjectgetObjectByCGLib(finalObjectobj){
/**
*運用CGLib的Enhancer創立署理目標
*引數一:目標的位元組碼檔案
*引數二:辦法的阻攔器
*/
ObjectproxyObj=Enhancer.create(obj.getClass(),newMethodInterceptor(){
publicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{
//辦法履行前
longstartTime=System.currentTimeMillis();
ObjectinvokeObject=method.invoke(obj,objects);//履行辦法的呼叫
//辦法履行后
longendTime=System.currentTimeMillis();
SimpleDateFormatsdf=newSimpleDateFormat();
System.out.printf(String.format("%s辦法履行結束時間:%%s;辦法履行耗時:%%d%%n"
,method.getName()),sdf.format(endTime),endTime-startTime);
returninvokeObject;
}
});
returnproxyObj;
}
}
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146904.html
標籤:Java
上一篇:Java三大框架是什么?
