91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis反射和動態代理的定義

發布時間:2021-09-10 14:35:24 來源:億速云 閱讀:140 作者:chen 欄目:開發技術

這篇文章主要介紹“MyBatis反射和動態代理的定義”,在日常操作中,相信很多人在MyBatis反射和動態代理的定義問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MyBatis反射和動態代理的定義”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

理解反射和動態代理
反射

首先看看官網對反射的定義:

可以通過java代碼,獲取當前加載類的字段、方法、構造函數等信息,并在安全限制內,使用反射字段、方法、構造函數進行操作。

簡單來說,可以在運行時獲得程序中每一個類型的成員信息。程序中定義的對象,其類型都是在編譯期確定的,而反射可以動態地創建對象,并訪問或調用其成員。

動態代理

所謂代理,是一個人或組織代替另一個人或組織做事,主要有3個角色:訪問者、代理人、被代理人,訪問者經由代理人,與被代理人交互,中間會加入一些自己的處理。

所謂的動態代理,是說在編譯時不需要定義代理類,而是在運行時創建,這個是關鍵:在運行時創建代理類。

Class對象

Class類是一個實實在在的類,存在于java.lang包中,用來表示運行時類型信息。Class對象表示自定義類的類型信息,比如創建一個User類,JVM就會創建一個User對應的Class對象,保存User類相關的類型信息,該對象保存在jvm堆中,作為訪問方法區中User類型信息的接口。

在使用自定義類時,會首先檢查這個類的Class對象是否已經加載,如果沒有加載,默認的類加載器就會先根據類名查找.class文件,Class對象就會被加載到內存。

可以通過下面3種方法獲取Class對象:

  • 使用Class類的forName靜態方法;

  • 直接獲取某一個對象的class;

  • 調用某個對象的getClass()方法;

Class對象是反射的基礎,提供了獲取類信息的方法,后面會介紹。

反射提供的功能

java反射框架主要提供以下內容:

  • 在運行時判斷對象所屬的類;

  • 在運行時創建對象;

  • 在運行時獲取類包含的成員變量、方法、父類、接口等信息;

  • 在運行時調用一個對象的方法;

下面舉例說明相關功能

創建實例:

//獲取String所對應的Class對象
Class<?> c = User.class;
//獲取String類帶一個String參數的構造器
Constructor constructor = c.getConstructor(String.class);
//根據構造器創建實例
User user = (User)constructor.newInstance("calm");

獲取方法:

//返回類或接口聲明的所有方法,包括私有的,但不包括繼承的方法
public Method[] getDeclaredMethods() throws SecurityException

//所有public方法,包括繼承的方法
public Method[] getMethods() throws SecurityException

//返回一個特定的方法,第一個參數為方法名稱,后面的參數為方法參數對應Class的對象
public Method getMethod(String name, Class<?>... parameterTypes)

調用方法:

Class<?> userClass=User.class;
Object obj = userClass.newInstance();
Method method =klass.getMethod("addRole",String.class);
method.invoke(obj,"超級管理員");
JDK動態代理

JDK本身提供了動態代理的實現,要求被代理者必須實現接口。

public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,InvocationHandler h)

第一個參數為類加載器,第二個參數是被代理者實現的接口列表,第三個參數是實現了InvocationHandler接口的對象。

InvocationHandler是一個接口,用于規范執行被代理者的方法,可在執行方法前后,添加公共的處理代碼。生成的動態代理類包含一個InvocationHandler屬性,調用對應方法時,會觸發invoke方法的調用。

public class JDKProxy implements InvocationHandler {    

    private Object targetObject;//被代理對象   

    public Object newProxy(Object targetObject) {        
        this.targetObject = targetObject;     
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}    

    public Object invoke(Object proxy, Method method, Object[] args)//invoke方法    
            throws Throwable {    
        Object ret = null;         
        ret  = method.invoke(targetObject, args);      
        return ret;    
    }    
}

測試代碼:

JDKProxy jdkProxy=new JDKProxy();
UserService userService = (UserService) 
jdkProxy.newProxy(new UserServiceImp());    
userService.addRole("超級管理員");

JDK動態代理的基本原理是根據定義好的規則,用傳入的接口創建一個新類。

CGLIB動態代理

JDK動態代理要求必須有接口,CGLIB(Code Generate Library)動態代理沒有這個要求,它是通過創建一個被代理類的子類,然后使用ASM字節碼庫修改代碼來實現的。

public class CGLibProxy implements MethodInterceptor {    
    private Object targetObject; //被代理對象

    public Object createProxyObject(Object obj) {    
        this.targetObject = obj;    
        Enhancer enhancer = new Enhancer();    
        enhancer.setSuperclass(obj.getClass());    
        enhancer.setCallback(this);    
        Object proxyObj = enhancer.create();    
        return proxyObj;
    }    

    public Object intercept(Object proxy, Method method, Object[] args,    
            MethodProxy methodProxy) throws Throwable {    
        Object obj = null;       
        obj = method.invoke(targetObject, args);    
        return obj;    
    }       
}

測試代碼:

CGLibProxy cgLibProxy=new CGLibProxy();
UserService userService = (UserService) 
cgLibProxy.newProxy(new UserServiceImp());    
userService.addRole("超級管理員");

到此,關于“MyBatis反射和動態代理的定義”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙阴县| 海安县| 亚东县| 四子王旗| 菏泽市| 茶陵县| 莱州市| 云梦县| 唐山市| 甘谷县| 防城港市| 盱眙县| 宁波市| 碌曲县| 昭觉县| 大余县| 右玉县| 镇坪县| 商河县| 塔城市| 茌平县| 苗栗市| 神农架林区| 沙雅县| 乐陵市| 达尔| 南溪县| 克东县| 双江| 禄劝| 陵川县| 方正县| 乌拉特后旗| 布拖县| 潞城市| 垫江县| 修水县| 台州市| 安吉县| 图木舒克市| 银川市|