最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解java動(dòng)態(tài)代理模式

 更新時(shí)間:2016年02月17日 08:59:00   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了java動(dòng)態(tài)代理模式,總結(jié)一下代理模式,以及jdk,cglib代理模式用法,來(lái)理解代理模式,感興趣的小伙伴們可以參考一下

本文針對(duì)java動(dòng)態(tài)代理進(jìn)行知識(shí)點(diǎn)整理,具體內(nèi)容如下

一. JAVA的動(dòng)態(tài)代理(比較官方說(shuō)法)
  代理模式是常用的java設(shè)計(jì)模式,他的特征是代理類(lèi)與委托類(lèi)有同樣的接口,代理類(lèi)主要負(fù)責(zé)為委托類(lèi)預(yù)處 理消息、過(guò)濾消息、把消息轉(zhuǎn)發(fā)給委托類(lèi),以及事后處理消息等。  代理類(lèi)與委托類(lèi)之間通常會(huì)存在關(guān)聯(lián)關(guān)系,一個(gè)代理類(lèi)的對(duì)象與一個(gè)委托類(lèi)的對(duì)象關(guān)聯(lián),代理類(lèi)的 對(duì)象本身并不真正實(shí)現(xiàn)服務(wù),而是通過(guò)調(diào)用委托類(lèi)的對(duì)象的相關(guān)方法,來(lái)提  供特定的服務(wù)。
  按照代理的創(chuàng)建時(shí)期,代理類(lèi)可以分為兩種。
  靜態(tài)代理:由程序員創(chuàng)建或特定工具自動(dòng)生成源代碼,再對(duì)其編譯。在程序運(yùn)行前,代理類(lèi)的.class文件就已經(jīng)存在了。
  動(dòng)態(tài)代理:在程序運(yùn)行時(shí),運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成。

二. 動(dòng)態(tài)代理實(shí)現(xiàn)

  java.lang.reflect.Proxy,
  Proxy 提供用于創(chuàng)建動(dòng)態(tài)代理類(lèi)和實(shí)例的靜態(tài)方法.
  newProxyInstance()
  返回一個(gè)指定接口的代理類(lèi)實(shí)例,該接口可以將方法調(diào)用指派到指定的調(diào)用處理程序。

 2.1. Dao接口(提供模擬數(shù)據(jù)訪問(wèn)層接口)

package javaproxy;
/*
 * 定義一個(gè)數(shù)據(jù)訪問(wèn)層接口
 */
public interface Dao {
 //模擬數(shù)據(jù)保存
public void save();
}

2.2. DaoImpl類(lèi)實(shí)現(xiàn)類(lèi)

package javaproxy;
 
public class DaoImpl implements Dao{
 
 @Override
 public void save() {
  System.out.println("執(zhí)行一個(gè)保存方法。。。。。。。。。。。。");
   
 }
 
}

2.3. 代理處理類(lèi)

package javaproxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
public class DaoHandler implements InvocationHandler{
 private Object obj;
public DaoHandler(Object obj) {
 this.obj=obj;
}
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
   System.out.println("do something before method");//這里模擬AOP的前置方法
   Object ret = method.invoke(this.obj, args);
   System.out.println("do something after method");//這里模擬AOP的后置方法
   return ret;
 }
 
}

 2.4. client調(diào)用

package javaproxy;
 
import java.lang.reflect.Proxy;
 
public class Client {
   
  public static void main(String[] args) {
   // 元對(duì)象(被代理對(duì)象)
   DaoImpl daoImpl = new DaoImpl();
   
   // 業(yè)務(wù)代理類(lèi)
   DaoHandler daoHandler=new DaoHandler(daoImpl);
   
   Dao dao=(Dao) Proxy.newProxyInstance(daoImpl
    .getClass().getClassLoader(), daoImpl.getClass()
    .getInterfaces(), daoHandler);
   
   dao.save();
 
 }
}

2. 5. 結(jié)果

3. 模擬Mybatis中的代理實(shí)現(xiàn)

3.1. MapperProxy類(lèi)

package javaproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MapperProxy implements InvocationHandler {
 @SuppressWarnings("unchecked")
 /*
  * 這里通過(guò)靜態(tài)方法得到實(shí)現(xiàn)類(lèi)的對(duì)象
  * 
  * @param:接口
  * 
  * @param:用sqlsession執(zhí)行方法
  * 
  * @return: 返回代理對(duì)像
  */
 public static <T> T newMapperProxy(Class<T> mapperInterface,
   Object sqlSession) {
  ClassLoader classLoader = mapperInterface.getClassLoader();
  Class<?>[] interfaces = new Class[] { mapperInterface };
  MapperProxy proxy = new MapperProxy();
  return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
 }

 /*
  * (non-Javadoc)
  * 
  * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
  * java.lang.reflect.Method, java.lang.Object[])
  * 
  * @param:代理對(duì)象
  * 
  * @param:方法通過(guò)方法名字找到對(duì)應(yīng)的方法
  * 
  * @param:通過(guò)方法傳入對(duì)象找到對(duì)應(yīng)的傳遞參數(shù)映射
  * 
  * @return:返回執(zhí)行后的參數(shù)對(duì)象
  */
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  // 這里通過(guò)方法名字以及參數(shù)通過(guò)解析對(duì)應(yīng)的mapper來(lái)執(zhí)行對(duì)應(yīng)的操作
  System.out.println("在這里執(zhí)行實(shí)際方法");
  return null;
 }

}

3.2. Client

package javaproxy;
 
import java.lang.reflect.Proxy;
 
public class Client {
   
  public static void main(String[] args) {
   
  Dao dao=MapperProxy.newMapperProxy(Dao.class, null);
  dao.save();
 
 }
}

 3.3. 結(jié)果

以上是使用JDK動(dòng)態(tài)代理的例子,希望對(duì)大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 使用Spring開(kāi)啟@Async異步方式(javaconfig配置)

    使用Spring開(kāi)啟@Async異步方式(javaconfig配置)

    這篇文章主要介紹了使用Spring開(kāi)啟@Async異步方式(javaconfig配置),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java繼承超詳細(xì)教程

    Java繼承超詳細(xì)教程

    繼承是面向?qū)ο笳Z(yǔ)法的三大特征之一,繼承可以降低代碼編寫(xiě)的冗余度,提高編程的效率,通過(guò)繼承,子類(lèi)獲得了父類(lèi)的成員變量和方法,一個(gè)子類(lèi)如何繼承父類(lèi)的字段和方法,如何修改從父類(lèi)繼承過(guò)來(lái)的子類(lèi)的方法呢,今天我們開(kāi)始學(xué)習(xí)有關(guān)Java繼承的知識(shí),感興趣的朋友一起看看吧
    2023-11-11
  • Java虛擬機(jī)工作原理

    Java虛擬機(jī)工作原理

    本文主要介紹了Java虛擬機(jī)的工作原理。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • SpringBoot返回json和xml的示例代碼

    SpringBoot返回json和xml的示例代碼

    本篇文章主要介紹了SpringBoot返回json和xml的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 關(guān)于SpringBoot中事務(wù)失效的幾種情況

    關(guān)于SpringBoot中事務(wù)失效的幾種情況

    這篇文章主要介紹了關(guān)于SpringBoot中事務(wù)失效的幾種情況,Spring AOP默認(rèn)使用動(dòng)態(tài)代理,會(huì)給被代理的類(lèi)生成一個(gè)代理類(lèi),事務(wù)相關(guān)的操作都通過(guò)代理來(lái)完成,使用內(nèi)部方法調(diào)用時(shí),使用的是實(shí)例調(diào)用,沒(méi)有通過(guò)代理類(lèi)調(diào)用方法,因此事務(wù)不會(huì)檢測(cè)到失敗,需要的朋友可以參考下
    2023-08-08
  • java實(shí)現(xiàn)pdf按頁(yè)轉(zhuǎn)換為圖片

    java實(shí)現(xiàn)pdf按頁(yè)轉(zhuǎn)換為圖片

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)pdf按頁(yè)轉(zhuǎn)換為圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Spring解決泛型擦除的思路詳解

    Spring解決泛型擦除的思路詳解

    這篇文章主要介紹了Spring解決泛型擦除的思路,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Java Fluent Mybatis 項(xiàng)目工程化與常規(guī)操作詳解流程篇 下

    Java Fluent Mybatis 項(xiàng)目工程化與常規(guī)操作詳解流程篇 下

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國(guó)內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis關(guān)于項(xiàng)目工程化與常規(guī)操作流程
    2021-10-10
  • java線(xiàn)程之使用Runnable接口創(chuàng)建線(xiàn)程的方法

    java線(xiàn)程之使用Runnable接口創(chuàng)建線(xiàn)程的方法

    本篇文章介紹了,java中使用Runnable接口創(chuàng)建線(xiàn)程的方法。需要的朋友參考下
    2013-05-05
  • 簡(jiǎn)單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過(guò)程

    簡(jiǎn)單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過(guò)程

    這篇文章主要介紹了簡(jiǎn)單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過(guò)程,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論

内乡县| 寿光市| 稷山县| 长岛县| 桐庐县| 广宁县| 杭锦后旗| 涿州市| 柳林县| 乌拉特中旗| 京山县| 石渠县| 罗定市| 理塘县| 广丰县| 曲周县| 宁乡县| 栾川县| 犍为县| 辽宁省| 文昌市| 佛学| 监利县| 白沙| 巴塘县| 镶黄旗| 顺昌县| 黔江区| 中宁县| 黑水县| 新河县| 辽阳县| 洞口县| 遂宁市| 方正县| 黔西县| 西城区| 英德市| 鄂伦春自治旗| 尼木县| 靖州|