天天看點

Java動态代理的應用

 先看一下代理模式,這個應該是設計模式中最簡單的一個了,類圖

Java動态代理的應用

  代理模式最大的特點就是代理類和實際業務類實作同一個接口(或繼承同一父類),代理對象持有一個實際對象的引用,外部調用時操作的是代理對象,而在代理對象的内部實作中又會去調用實際對象的操作

 Java動态代理其實内部也是通過Java反射機制來實作的,即已知的一個對象,然後在運作時動态調用其方法,這樣在調用前後作一些相應的處理,這樣說的比較籠統,舉個簡單的例子

   比如我們在應用中有這樣一個需求,在對某個類的一個方法的調用前和調用後都要做一下日志操作,

一個普通的接口

public interface AppService {

public boolean createApp(String name);

該接口的預設實作類

public class AppServiceImpl implements AppService {

public boolean createApp(String name) {

System.out.println("App["+name+"] has been created.");

return true;

}

日志處理器

public class LoggerInterceptor implements InvocationHandler {//注意實作這個Handler接口

private Object target;//目标對象的引用,這裡設計成Object類型,更具通用性

public LoggerInterceptor(Object target){

this.target = target;

}

public Object invoke(Object proxy, Method method, Object[] arg)

throws Throwable {

System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+arg[0]+"}");

Object result = method.invoke(target, arg);//調用目标對象的方法

System.out.println("Before return:"+result);

return result;

}

}

外部調用

public class Main {

public static void main(String[] args) {

AppService target = new AppServiceImpl();//生成目标對象

//接下來建立代理對象

AppService proxy = (AppService) Proxy.newProxyInstance(

target.getClass().getClassLoader(),

target.getClass().getInterfaces(), new LoggerInterceptor(target));

proxy.createApp("Kevin Test");

}