關(guān)于Java動(dòng)態(tài)代理的解析
動(dòng)態(tài)代理類(lèi)是位于Java.lang.reflect包下的Interface InvocationHandler。下面小編準(zhǔn)備了關(guān)于Java動(dòng)態(tài)代理的解析,提供給大家參考!
眾所周知,JDK的動(dòng)態(tài)代理模式必須實(shí)現(xiàn)接口。
以下面的源碼為例:
接口一:
public interface ActionInterface {
void doSelf(String str);
String getType();
}
接口二:
public interface InterruupIntf {
void interrup();
}
實(shí)現(xiàn)類(lèi):
public class MyselfImpl implements ActionInterface, InterruupIntf {
public String getType() {
String type = "公用部門(mén)";
System.out.println(type);
return type;
}
public void doSelf(String str) {
System.out.println("業(yè)務(wù)實(shí)現(xiàn)類(lèi): " + str + " !");
}
public void interrup() {
System.out.println("發(fā)呆三分鐘!");
}
}
動(dòng)態(tài)代理需要反射,
* 必須要實(shí)現(xiàn)InvocationHandler接口
* 能夠?qū)λ械姆椒ㄟM(jìn)行代理
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
/**
* 通過(guò)構(gòu)造方法來(lái)設(shè)置被代理的對(duì)象
* @param obj
*/
public MyInvocationHandler(Object obj) {
this.obj = obj;
}
/**
* 動(dòng)態(tài)代理需要反射
*
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情");
Object returnObject = method.invoke(obj, args);
System.out.println("+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情");
return returnObject;
}
/**
* 測(cè)試函數(shù)
* 動(dòng)態(tài)代理對(duì)所有的代理類(lèi)都進(jìn)行了攔截
* @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 {
//實(shí)現(xiàn)業(yè)務(wù)邏輯的類(lèi)
MyselfImpl muSelf = new MyselfImpl();
//JDK創(chuàng)建的.動(dòng)態(tài)邏輯類(lèi),調(diào)用上面的構(gòu)造函數(shù)注入
MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);
/*
Class proxyClass = Proxy.getProxyClass(
MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces());
//建業(yè)務(wù)邏輯類(lèi)的動(dòng)態(tài)代理類(lèi)
Object proxy = proxyClass.getConstructor(
new Class[] { InvocationHandler.class }).newInstance(
new MyInvocationHandler(new MyselfImpl())); */
//建業(yè)務(wù)邏輯類(lèi)的動(dòng)態(tài)代理類(lèi)
Object proxy = Proxy.newProxyInstance(MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces(), myInvocation);
//業(yè)務(wù)類(lèi)自己調(diào)用運(yùn)行代理對(duì)象
ActionInterface testIntf = (ActionInterface) proxy;
testIntf.doSelf("我要做業(yè)務(wù)了!");
testIntf.getType();
InterruupIntf intIntf = (InterruupIntf) proxy;
intIntf.interrup();
}
}
運(yùn)行最后一個(gè)類(lèi)的MAIN函數(shù),控制臺(tái)輸出結(jié)果如下:
+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情
業(yè)務(wù)實(shí)現(xiàn)類(lèi): 我要做業(yè)務(wù)了! !
+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情
+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情
公用部門(mén)
+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情
+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情
發(fā)呆三分鐘!
+++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情
看到結(jié)果了。
JDK的動(dòng)態(tài)代理,對(duì)MyselfImpl所有方法都進(jìn)行了攔截,在調(diào)用真正的業(yè)務(wù)類(lèi)方法之前之后都插入了代碼,這就是JDK的動(dòng)態(tài)代理。其實(shí)SPRING的AOP思想的基本原理也是這個(gè),但是它寫(xiě)的比較負(fù)責(zé),而且比較優(yōu)秀。
【關(guān)于Java動(dòng)態(tài)代理的解析】相關(guān)文章:
Java動(dòng)態(tài)代理實(shí)現(xiàn)AOP的方法10-25
解析動(dòng)態(tài)NAT配置05-19
java語(yǔ)言的特性解析06-02
解析動(dòng)態(tài)NAT配置「實(shí)例」05-12
Java的內(nèi)存劃分全解析09-01
Java如何設(shè)置代理IP訪問(wèn)網(wǎng)站12-18
java命令行參數(shù)解析201611-11