創建Java動態代理

Java動態代理機制提供了一種有趣的方式來創建代理實例。 不過,創建動態代理的步驟有些繁瑣,請考慮將代理用于審核服務實例的方法調用所花費的時間–
public interface InventoryService {public Inventory create(Inventory inventory);public List<Inventory> list();public Inventory findByVin(String vin);public Inventory update(Inventory inventory);public boolean delete(Long id);public Inventory compositeUpdateService(String vin, String newMake);
}

為該接口的實例創建動態代理的步驟如下:

1.創建一個java.lang.reflect.InvocationHandler的實例,它將負責代表實際服務實例處理方法調用,用于審核的示例Invocation處理程序如下:

...
public class AuditProxy implements java.lang.reflect.InvocationHandler {private Object obj;public static Object newInstance(Object obj) {return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new AuditProxy(obj));}private AuditProxy(Object obj) {this.obj = obj;}public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {Object result;try {logger.info("before method " + m.getName());long start = System.nanoTime();result = m.invoke(obj, args);long end = System.nanoTime();logger.info(String.format("%s took %d ns", m.getName(), (end-start)) );} catch (InvocationTargetException e) {throw e.getTargetException(); } catch (Exception e) {throw new RuntimeException("unexpected invocation exception: " + e.getMessage());} finally {logger.info("after method " + m.getName());}return result;}
}

2.創建InventoryService實例時,返回一個代理,在本例中為AuditProxy,它構成InventoryService的實例,使用UML可以更好地解釋該代理:

這就是它在代碼中的樣子:

InventoryService inventoryService = (InventoryService)AuditProxy.newInstance(new DefaultInventoryService());

現在,對庫存服務的任何調用都將通過AuditProxy實例進行,該實例將在將實際方法調用委派給InventoryService實例的同時測量方法花費的時間。

那么代理用于:
1. Spring AOP廣泛使用它–它在內部為不同的AOP構造創建動態代理
2.如本例所示,對于任何類別的裝??飾,盡管AOP絕對適合這種用例 3.對于需要支持基于接口和注釋的功能的任何框架–甚至不需要真實的代理實例,動態代理可以基于通過注釋提供的一些元數據來重新創建接口的預期行為。

參考: all和雜物博客上的JCG合作伙伴 Biju Kunjummen 創建了Java動態代理 。


翻譯自: https://www.javacodegeeks.com/2012/08/creating-java-dynamic-proxy.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371692.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?...

新特性&#xff1a; 1. 拖拽釋放(Drag and drop) API 2. 語義化更好的內容標簽&#xff08;header,nav,footer,aside,article,section&#xff09; 3. 音頻、視頻API(audio,video) 4. 畫布(Canvas) API 5. 地理(Geolocation) API 6. 本地離線存儲 localStorage 長期存儲數據&am…

Substring with Concatenation of All Words 題解

題意 You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters. For example, give…

java udp丟包_linux 系統 UDP 丟包問題分析思路

最近工作中遇到某個服務器應用程序 UDP 丟包&#xff0c;在排查過程中查閱了很多資料&#xff0c;總結出來這篇文章&#xff0c;供更多人參考。在開始之前&#xff0c;我們先用一張圖解釋 linux 系統接收網絡報文的過程。● 首先網絡報文通過物理網線發送到網卡● 網絡驅動程…

【SQL】分組數據,過濾分組-group by , having

學習筆記&#xff0c;原文來自http://blog.csdn.net/robinjwong/article/details/24845125 創建分組 - GROUP BY 分組是在SELECT語句的GROUP BY子句中建立的。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域&#xff0c;然后針對若干個小區域進行數據處理。SELECT子…

使用EasyMock或Mockito

我大部分時間都在使用EasyMock &#xff0c;但是最近我和一些非常愿意使用Mockito的人一起工作。 我不打算在同一項目中使用兩個框架來實現相同的目的&#xff0c;因此我采用了Mockito 。 因此&#xff0c;在過去的幾個月中&#xff0c;我一直在使用Mockito &#xff0c;這是我…

CentOS下iptables 配置詳解

如果你的IPTABLES基礎知識還不了解,建議先去看看. 開始配置 我們來配置一個filter表的防火墻. (1)查看本機關于IPTABLES的設置情況 [roottp ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy…

java lambda 多個參數_Java Lambda行為參數化

Java Lambda行為參數化我們可以將lambda表達式作為參數傳遞給方法。例子以下代碼創建了一個名為Calculator的函數接口。在Calculator中有一個稱為calculate的方法&#xff0c;它接受兩個int參數并返回一個int值。在Main類中有一個引擎方法&#xff0c;它接受函數接口Calculator…

具有關聯映射的Hibernate Composite ID

最近&#xff0c;我們面臨著帶有復合id字段的休眠關聯映射的棘手情況。 我們需要與一對一和多對一建立雙向關聯。我們的拖曳表是“ REPORT”和“ REPORT_SUMMARY”&#xff0c;它們之間具有從REPORT到REPORT_SUMMARY的一對多關系&#xff0c;而從REPORT_SUMMARY到REPORT表。 RE…

ZooKeeper應用場景

ZooKeeper是一個高可用的分布式數據管理與系統協調框架。基于對Paxos算法的實現&#xff0c;使該框架保證了分布式環境中數據的強一致性&#xff0c;也正是基于這樣的特性&#xff0c;使得ZooKeeper解決很多分布式問題。網上對ZK的應用場景也有不少介紹&#xff0c;本文將結合作…

java main test_java調用main自動執行testng方法一

主方法import com.com.utlis.createTestngXml;import org.testng.TestNG;import java.util.ArrayList;import java.util.List;/*** author lw* createTime 2019/3/30 15:35* description testng調試類*/public class inittet {private static final String ESCAPE_PROPERTY &q…

有趣的Ruby-學習筆記3

Ruby方法方法名要以小寫字母開頭。假設用大寫字母開頭會被作為常量 &#xff08;這點非常奇怪&#xff09;定義一個無參的方法def method_name expr.. end定義一個有參的方法def method_name (var1, var2)expr.. end給參數設定默認值def method_name (var1value1, var2value2)e…

ADF:動態視圖對象

今天&#xff0c;我想寫有關動態視圖對象的文章&#xff0c;它允許我在運行時更改其數據源&#xff08;SQL查詢&#xff09;和屬性。 我將使用oracle.jbo.ApplicationModule :: createViewObjectFromQueryStmt方法來解決此問題。 我將逐步介紹如何執行此操作 創建視圖對象和應…

java stack list_JAVA自己實現List接口Stack

package 集合.Stack;import java.util.Arrays;import java.util.EmptyStackException;import java.util.Vector;public class MyStack {//底層數組默認長度為10private Object[] myStack new Object[10];//sizeprivate int size 0;public MyStack() {}//pushpublic Object pu…

刷題總結——序列操作(權值線段樹套樹狀數組)

題目&#xff1a; 題目描述 給出序列 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff08;0≤ai≤109&#xff09;&#xff0c;有關序列的兩種操作。 1. ai&#xff08;1≤i≤n&#xff09;變成 x&#xff08;0≤x≤109&#xff09;。 2. 求 al&#xff0c;al1&#xff…

原型模式Prototype

原型模式 http://www.cnblogs.com/zhili/p/PrototypePattern.html ICloneable接口 https://msdn.microsoft.com/en-us/library/system.icloneable(vvs.110).aspx Supports cloning, which creates a new instance of a class with the same value as an existing instance. Rem…

I / O神秘化

由于對高度可擴展的服務器設計的所有炒作以及對nodejs的狂熱&#xff0c;我一直想重點研究IO設計模式&#xff0c;直到現在為止都沒有足夠的時間進行投資。 現在已經做了一些研究&#xff0c;我認為最好記下我遇到的東西&#xff0c;作為對我以及可能遇到這篇文章的任何人的未來…

java三大特性 繼承_java基礎(二)-----java的三大特性之繼承

在《Think in java》中有這樣一句話&#xff1a;復用代碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言&#xff0c;僅僅能夠復制代碼并對加以改變是不夠的&#xff0c;它還必須能夠做更多的事情。在這句話中最引人注目的是“復用代碼”,盡可能的復用代碼使我們程…

Maven本地倉庫配置

本地倉庫是遠程倉庫的一個緩沖和子集&#xff0c;當你構建Maven項目的時候&#xff0c;首先會從本地倉庫查找資源&#xff0c;如果沒有&#xff0c;那么Maven會從遠程倉庫下載到你本地倉庫。這樣在你下次使用的時候就不需要從遠程下載了。如果你所需要的jar包版本在本地倉庫沒有…

配置CDI對話的超時

在開發JSF應用程序時&#xff0c;CDI對話范圍是一個很好的功能。 假設您有大型數據表&#xff0c;需要花費很長時間才能加載。 由于高內存消耗&#xff0c;您通常不希望將加載的數據放在會話范圍的Bean中。 而且&#xff0c;您不能將加載的數據放入視圖范圍的Bean中&#xff0c…

記錄下log4j的兩種配置方式

XML文件配置 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/><!-- 輸出到控制臺 --><appender na…