- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java基礎之動(dòng)態(tài)代理Cglib詳解
經(jīng)測試,jdk創(chuàng )建對象的速度遠大于cglib,這是由于cglib創(chuàng )建對象時(shí)需要操作字節碼。cglib執行速度略大于jdk,所以比較適合單例模式。另外由于CGLIB的大部分類(lèi)是直接對Java字節碼進(jìn)行操作,這樣生成的類(lèi)會(huì )在Java的永久堆中。如果動(dòng)態(tài)代理操作過(guò)多,容易造成永久堆滿(mǎn),觸發(fā)OutOfMemory異常。spring默認使用jdk動(dòng)態(tài)代理,如果類(lèi)沒(méi)有接口,則使用cglib。
package proxy.cglib; /** * @Description: <br/> * 訂單服務(wù) * <p> * <br/> * @Author: Qz1997 * @create 2021/5/1 10:51 */ public class OrderServiceImpl { /** * 下單 * * @param orderNo 訂單號 * @return 結果 */ public String preOrder(String orderNo) { System.out.println("OrderServiceImpl.preOrder" + orderNo); return "下單成功"; } /** * 下單 * * @return 結果 */ public String list() { return "list"; } }
package proxy.cglib; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.Objects; /** * @Description: <br/> * Cglib 通過(guò)繼承的方式 實(shí)習代理 * final類(lèi) 和 final 方法 不能代理 * <p> * <br/> * @Author: Qz1997 * @create 2021/5/1 13:24 */ public class CglibProxyFactory implements MethodInterceptor { /** * 創(chuàng )建一個(gè)代理對象 * * @param clazz 類(lèi)型 * @return 代理對象 */ public Object creatProxyedObj(Class<?> clazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } /** * 代理方法 * * @param proxyObject 代理對象 * @param method 方法 * @param args 方法參數 * @param methodProxy 代理方法 * @return * @throws Throwable */ @Override public Object intercept(Object proxyObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // 判斷方法參數 如果是null || 參數格式 <= 0 if (Objects.isNull(args) || args.length <= 0) { return methodProxy.invokeSuper(proxyObject, args); } /// // 判斷這個(gè)方法上是否包含某個(gè)注解 // if (method.isAnnotationPresent(Async.class)) { // // ....進(jìn)行一頓增強 // // return method.invoke(proxy, arg); // } Parameter[] parameters = method.getParameters(); Parameter parameter = parameters[0]; Class<?> type = parameter.getType(); // 類(lèi)型為String if (type == String.class) { String orderNo = (String) args[0]; if (Objects.nonNull(orderNo) && orderNo.length() < 10) { throw new RuntimeException("訂單號錯誤"); } } String result = (String) methodProxy.invokeSuper(proxyObject, args); if (Objects.equals(result, "下單成功")) { System.out.println("發(fā)動(dòng)訂單短信"); } return result; } }
到此這篇關(guān)于Java基礎之動(dòng)態(tài)代理Cglib詳解的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)代理Cglib內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站