1. 程式人生 > >SSM-Spring-09:Spring中jdk動態代理

SSM-Spring-09:Spring中jdk動態代理

方式 方法 案例 reflect jdk BE nbsp size 調用

------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------

JDK動態代理:

  為何叫JDK動態代理呢?

    所謂JDK,jdk是java開發工具包,它裏面包含了一個動態代理的api

    代理是一種常用的設計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負責為委托類預處理消息,過濾消息並轉發消息,以及進行消息被委托類執行後的後續處理。

    何為動態?相比於靜態代理,動態代理避免了開發人員編寫各個繁鎖的靜態代理類,只需簡單地指定一組接口及目標類對象就能動態的獲得代理對象。

  下面我拿例子帶入,具體的動態代理案例如下:

    首先按平時的方式來寫,一個接口,一個實現它的類

      ISomeService接口

package cn.dawn.day09jdkdtproxy;

/**
 * Created by Dawn on 2018/3/8.
 */
public interface ISomeService {
    public void doSome();
}

      SomeServiceImpl類,實現ISomeService接口

package cn.dawn.day09jdkdtproxy;

/**
 * Created by Dawn on 2018/3/8.
 */
public class
SomeServiceImpl implements ISomeService { public void doSome() { System.out.println("do something"); } }

      測試類,用動態代理的形式,對方法進行增強操作

package cn.dawn.day09jdkdtproxy;

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

/** * Created by Dawn on 2018/3/8. */ public class Test { public static void main(String[] args) { /*匿名內部類要想得到外面的值,需要把外面的值改為常量*/ final ISomeService service=new SomeServiceImpl(); /*用動態代理的方式生成ISomeService的對象,就是增強後的對象,可以看看newProxyInstance的方法參數,就有方法去寫了*/ /*InvocationHandler是由代理實例的調用處理程序實現的接口。*/ ISomeService proxy=(ISomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() { /** *invoke:每個代理實例都有一個關聯的調用處理程序。當在代理實例上調用方法時,方法調用將被編碼並分派給invoke 其調用處理程序的方法。 * @param proxy 代理對象,沒啥用 * @param method 反射獲取的方法 * @param args 方法的參數 * @return * @throws Throwable */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before==================="); method.invoke(service,args);//相當於執行目標類型的方法 return null; } }); proxy.doSome(); } }

      值得一提的是:Proxy是java.lang.reflect包下,正因如此,才叫JDK動態代理

SSM-Spring-09:Spring中jdk動態代理