• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

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

        時(shí)間:2024-09-28 05:12:53 JAVA認(rèn)證 我要投稿
        • 相關(guān)推薦

        關(guān)于Java動(dòng)態(tài)代理的解析

          動(dòng)態(tà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)類:

          public class MyselfImpl implements ActionInterface, InterruupIntf {

          public String getType() {

          String type = "公用部門";

          System.out.println(type);

          return type;

          }

          public void doSelf(String str) {

          System.out.println("業(yè)務(wù)實(shí)現(xiàn)類: " + 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;

          /**

          * 通過構(gòu)造方法來設(shè)置被代理的對象

          * @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;

          }

          /**

          * 測試函數(shù)

          * 動(dòng)態(tà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ù)邏輯的類

          MyselfImpl muSelf = new MyselfImpl();

          //JDK創(chuàng)建的動(dòng)態(tài)邏輯類,調(diào)用上面的構(gòu)造函數(shù)注入

          MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);

          /*

          Class proxyClass = Proxy.getProxyClass(

          MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces());

          //建業(yè)務(wù)邏輯類的動(dòng)態(tài)代理類

          Object proxy = proxyClass.getConstructor(

          new Class[] { InvocationHandler.class }).newInstance(

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

          //建業(yè)務(wù)邏輯類的動(dòng)態(tài)代理類

          Object proxy = Proxy.newProxyInstance(MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces(), myInvocation);

          //業(yè)務(wù)類自己調(diào)用運(yùn)行代理對象

          ActionInterface testIntf = (ActionInterface) proxy;

          testIntf.doSelf("我要做業(yè)務(wù)了!");

          testIntf.getType();

          InterruupIntf intIntf = (InterruupIntf) proxy;

          intIntf.interrup();

          }

          }

          運(yùn)行最后一個(gè)類的MAIN函數(shù),控制臺(tái)輸出結(jié)果如下:

          +++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情

          業(yè)務(wù)實(shí)現(xiàn)類: 我要做業(yè)務(wù)了! !

          +++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情

          +++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情

          公用部門

          +++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情

          +++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情

          發(fā)呆三分鐘!

          +++++++++++調(diào)用業(yè)務(wù)方法之前做其他事情

          看到結(jié)果了。

          JDK的動(dòng)態(tài)代理,對MyselfImpl所有方法都進(jìn)行了攔截,在調(diào)用真正的業(yè)務(wù)類方法之前之后都插入了代碼,這就是JDK的動(dòng)態(tài)代理。其實(shí)SPRING的AOP思想的基本原理也是這個(gè),但是它寫的比較負(fù)責(zé),而且比較優(yōu)秀。

        【Java動(dòng)態(tài)代理的解析】相關(guān)文章:

        Java動(dòng)態(tài)代理實(shí)現(xiàn)AOP的方法07-22

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

        解析動(dòng)態(tài)NAT配置09-24

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

        Java的內(nèi)存劃分全解析08-02

        java命令行參數(shù)解析201608-12

        計(jì)算機(jī)二級JAVA考點(diǎn)解析10-12

        關(guān)于計(jì)算機(jī)二級JAVA考點(diǎn)解析07-14

        Java與Java web的區(qū)別08-10

        2017年計(jì)算機(jī)二級JAVA考點(diǎn)解析08-03

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲噜噜网站在线观看 | 在线中文字幕亚洲日韩2020 | 亚洲成a人片在线播放 | 中文字幕免费在线看线人动作大片 | 亚洲精选中文字幕 | 亚洲欧美中文专区 |