1. 程式人生 > >寫一個 ArrayList 的動態代理類(變數修飾問題)

寫一個 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