動態代理類是位於ect包下的Interface InvocationHandler。下面小編準備了關於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思想的基本原理也是這個,但是它寫的比較負責,而且比較優秀。