久久久久无码精品,四川省少妇一级毛片,老老熟妇xxxxhd,人妻无码少妇一区二区

Java動(dòng)態(tài)代理的解析

時(shí)間:2020-10-08 16:14:57 JAVA認(rèn)證 我要投稿

關(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

Java腳本動(dòng)態(tài)用法10-26

Java中的動(dòng)態(tài)代碼編程06-05

解析動(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