當前位置:才華齋>IT認證>JAVA認證>

關於Java動態代理的解析

JAVA認證 閱讀(2.66W)

動態代理類是位於ect包下的Interface InvocationHandler。下面小編準備了關於Java動態代理的解析,提供給大家參考!

關於Java動態代理的解析

眾所周知,JDK的動態代理模式必須實現介面。

以下面的原始碼為例:

  介面一:

public interface ActionInterface {

void doSelf(String str);

String getType();

}

  介面二:

public interface InterruupIntf {

void interrup();

}

  實現類:

public class MyselfImpl implements ActionInterface, InterruupIntf {

public String getType() {

String type = "公用部門";

tln(type);

return type;

}

public void doSelf(String str) {

tln("業務實現類: " + str + " !");

}

public void interrup() {

tln("發呆三分鐘!");

}

}

動態代理需要反射,

* 必須要實現InvocationHandler介面

* 能夠對所有的方法進行代理

public class MyInvocationHandler implements InvocationHandler {

private Object obj;

/**

* 通過構造方法來設定被代理的物件

* @param obj

*/

public MyInvocationHandler(Object obj) {

= obj;

}

/**

* 動態代理需要反射

*

*/

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

throws Throwable {

tln("+++++++++++呼叫業務方法之前做其他事情");

Object returnObject = ke(obj, args);

tln("+++++++++++呼叫業務方法之前做其他事情");

return returnObject;

}

/**

* 測試函式

* 動態代理對所有的代理類都進行了攔截

* @throws NoSuchMethodException

* @throws InvocationTargetException

* @throws IllegalAccessException

* @throws InstantiationException

* @throws SecurityException

* @throws IllegalArgumentException

*/

public static void main(String[] args) throws InterruptedException,

IllegalArgumentException, SecurityException,

InstantiationException, IllegalAccessException,

InvocationTargetException, NoSuchMethodException {

//實現業務邏輯的類

MyselfImpl muSelf = new MyselfImpl();

//JDK建立的'動態邏輯類,呼叫上面的建構函式注入

MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);

/*

Class proxyClass = roxyClass(

lassLoader(), nterfaces());

//建業務邏輯類的動態代理類

Object proxy = onstructor(

new Class[] { s })nstance(

new MyInvocationHandler(new MyselfImpl())); */

//建業務邏輯類的動態代理類

Object proxy = roxyInstance(lassLoader(), nterfaces(), myInvocation);

//業務類自己呼叫執行代理物件

ActionInterface testIntf = (ActionInterface) proxy;

lf("我要做業務了!");

ype();

InterruupIntf intIntf = (InterruupIntf) proxy;

rrup();

}

}

執行最後一個類的MAIN函式,控制檯輸出結果如下:

+++++++++++呼叫業務方法之前做其他事情

業務實現類: 我要做業務了! !

+++++++++++呼叫業務方法之前做其他事情

+++++++++++呼叫業務方法之前做其他事情

公用部門

+++++++++++呼叫業務方法之前做其他事情

+++++++++++呼叫業務方法之前做其他事情

發呆三分鐘!

+++++++++++呼叫業務方法之前做其他事情

看到結果了。

JDK的動態代理,對MyselfImpl所有方法都進行了攔截,在呼叫真正的業務類方法之前之後都插入了程式碼,這就是JDK的動態代理。其實SPRING的AOP思想的基本原理也是這個,但是它寫的比較負責,而且比較優秀。