寫一個 ArrayList 的動態代理類(變數修飾問題)
1. final List<String> list = new ArrayList<String>(); 2. 3. List<String> proxyInstance = 4. (List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(), 5. list.getClass().getInterfaces(), 6. new InvocationHandler() { 7. 8. @Override 9. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 10. return method.invoke(list, args); 11. } 12. }); 13. proxyInstance.add("你好"); 14. System.out.println(list);
因為改動態代理方法使用的是匿名內部類實現的,所以上面的list物件使用final修飾(被final修飾其地址值不變,才可以在匿名內部類中被使用)
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JDKProxy implements InvocationHandler { private Object target; public JDKProxy (Object target){ this.target=target; } public Object createProxy(){ //得到目標的classload ClassLoader classLoader = target.getClass().getClassLoader(); //得到目標物件實現的介面陣列 Class[] interfaces = target.getClass().getInterfaces(); return Proxy.newProxyInstance(classLoader, interfaces, this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("瞎搞"); return method.invoke(target, args); }
在spring框架中使用JDK動態代理實現,可以使用實現介面的方式,沒有使用匿名內部類,則變數可以不使用final修飾,改例子中使用的是private
}
相關推薦
寫一個 ArrayList 的動態代理類(變數修飾問題)
1. final List<String> list = new ArrayList<String>(); 2. 3. List<String> proxyInstance = 4. (List<String>)Proxy.ne
【乾貨】JDK動態代理的實現原理以及如何手寫一個JDK動態代理
動態代理 代理模式是設計模式中非常重要的一種型別,而設計模式又是程式設計中非常重要的知識點,特別是在業務系統的重構中,更是有舉足輕重的地位。代理模式從型別上來說,可以分為靜態代理和動態代理兩種型別。 在解釋動態代理之前我們先理解一下靜態代理: 首先你要明白靜態代理的作用 我們有一
用cglib包來為類產生動態代理類對象
方法 source uil owa pac 類對象 進行 desc clas 一:在JDK裏也有動態代理的類和接口,是Proxy和InvocationHandler,但是Proxy只能為接口產生代理類,借助InvocationHandler的實現類來完成對類對象的代理;
C#使用Emit構造攔截器動態代理類
too don ati 記錄 type sem let module mic 在AOP編程概念介紹中,常見的示例為攔截對象,並在對象的某方法執行前和執行後分別記錄日誌。 而最常用的攔截方式是使用動態代理類,用其封裝一個日誌攔截器,當方法被執行時進行日誌記錄。 日誌攔截器類
使用計算類BigDecimal寫一個精確計算工具類
在日常開放當中需要我們計算數字,利率。通常Java的做法是使用Math相關的API。但是,這樣做是不夠精確的,由於float和double不能進行計算,如果強行進行計算會使得計算不準確。造成難以挽回的損失。為了彌補這一個缺點Java提供了BigDecimal這個類來解決。在使用這個類的時候需要將do
寫一個時間格式化的類
package visoup.framework.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java
學習筆記 利用反射 手寫一個簡單的實體類 轉json 的方法
不得不說 反射真的是個好動 # 貼上我的程式碼 package com.lengff.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetExce
php寫一個操作mysql的類
首先是mysql方式 <?php class ConnectionMySQL{ //主機 private $host="localhost"; //資料庫的username private $name="root"; //資料
反射包 java.lang.reflect⑦ 之 Java 中 Proxy 動態代理類 探祕(三)
這個系列好久沒有續作了,你以為完了,錯了。這個動態代理有說不完的知識點,我也是在不斷的學習中才瞭解得到更多的知識。但無可否認的一點是它需更多其他的知識的支援,比如設計模式,設計思想。工作越久越覺得設計模式這個東西的重要性。 其實動態代理的前兩個例子只是簡單的列出了它的一個
JDK動態代理深入理解分析並手寫簡易JDK動態代理(下)
上篇分析的是JDK動態代理實現原理,這個下篇是一個自實現的動態代理案例,這一篇我們自定義代理Proxy,代理業務需要實現的Handler介面,以及類載入器ClassLoader;最終我們以自己寫的程式碼去生成代理類的程式碼,再用代理類的程式碼去代理執行我們的業務程式碼,完成一套標準的動態代理; 首先我們分析
JDK動態代理深入理解分析並手寫簡易JDK動態代理(上)
部落格真的是好幾個月沒更了,2019新年第一篇,繼續深入動態代理,前兩篇簡單分析了動態代理的實現原理之後,這次繼續深入瞭解具體的實現方式,並手寫一套簡易的動態代理已加強理解; 先接上一篇程式碼,這裡先上程式碼說話,一個簡單案列,代理找物件和找工作: JDK動態代理只能代理有介面的類,定義Persion介面
JDK和CGLIB生成動態代理類的區別
關於動態代理和靜態代理 當一個物件(客戶端)不能或者不想直接引用另一個物件(目標物件),這時可以應用代理模式在這兩者之間構建一個橋樑--代理物件。 按照代理物件的建立時期不同,可以分為兩種: 靜態代理:事先寫好代理物件類,在程式釋出前就已經存在了; 動態代理:應
利用Android反射與泛型機制寫一個通用的Adapter類
注意點:Android的反射機制有一個問題,就是Class.getDeclaredFields()返回的變數陣列與我們定義的類的變數順序是不一致的.Android是經過了字母順序排序的.所以我們需要將變數名傳入adapter //定義一個帶泛型的抽象類作為基類
CGLIB 和 JDK生成動態代理類的區別
AOP 使用的設計模式就是代理模式,是對IOC設計的補充。為了擴充套件性,往往會加上反射,動態生成位元組碼,生成代理類。 這裡往往還會使用到DI,把代理的實現類通過依賴注入的方式,傳給代理工廠。 關於生成動態代理類的方式有兩種:JDK和CGLIB。 CGLIB,是一個開源工具。spring 和hibernat
如何寫一個巢狀實體類,賦值,轉化為JSON格式的字串
1、下面是實體類的寫法 import java.io.Serializable; import java.util.List; import com.alibaba.fastjson.JSONObject; //通過Serializable的toString方法,將類轉變為
寫一個單例的類
就是寫一個例項化一次的類 即把構造私有化,外部無法例項化他。通過呼叫他的靜態方法,判斷是否例項化了,未例項化則例項化並返回,已例項化則返回已例項化的。 一: /** * 基於雙重檢查鎖定的單例模式 * @author zongzhimin *
動態代理類
//InvocationHandlerImpl 實現了InvocationHandler介面,並能實現方法呼叫從代理類到委託類的分
實現一個基於動態代理的 AOP
實現一個基於動態代理的 AOP Intro 上次看基於動態代理的 AOP 框架實現,立了一個 Flag, 自己寫一個簡單的 AOP 實現示例,今天過來填坑了 目前的實現是基於 Emit 來做的,後面有時間再寫一個基於 Roslyn 來實現的示例 效果演示 演示程式碼: 切面邏輯定義: public class
動態代理:如何深入理解和分析,不如手寫一個(原始碼包分析、樓主親測)
如何分類Java語言? Java是靜態的強型別語言,但是因為提供了類似反射等機制,也具備了部分動態語言的能力。 一、動態代理的簡單描述 動態代理是一種方便執行時動態構建代理、動態處理代理方法呼叫的機制,很多場景都是利用類似的機制做到的,比如用來包裝RPC呼叫、面向切面的程式設
採用動態代理的方式對一個類進行增強
建立一個介面 package com.itheima.proxy; /* * 服務員的介面 */ public interface Waiter { public void server(); public String say