<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>

            Java動態代理的解析

            時間:2024-09-28 05:12:53 JAVA認證 我要投稿
            • 相關推薦

            關于Java動態代理的解析

              動態代理類是位于Java.lang.reflect包下的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 = "公用部門";

              System.out.println(type);

              return type;

              }

              public void doSelf(String str) {

              System.out.println("業務實現類: " + str + " !");

              }

              public void interrup() {

              System.out.println("發呆三分鐘!");

              }

              }

              動態代理需要反射,

              * 必須要實現InvocationHandler接口

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

              public class MyInvocationHandler implements InvocationHandler {

              private Object obj;

              /**

              * 通過構造方法來設置被代理的對象

              * @param obj

              */

              public MyInvocationHandler(Object obj) {

              this.obj = obj;

              }

              /**

              * 動態代理需要反射

              *

              */

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

              throws Throwable {

              System.out.println("+++++++++++調用業務方法之前做其他事情");

              Object returnObject = method.invoke(obj, args);

              System.out.println("+++++++++++調用業務方法之前做其他事情");

              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 = Proxy.getProxyClass(

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

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

              Object proxy = proxyClass.getConstructor(

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

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

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

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

              //業務類自己調用運行代理對象

              ActionInterface testIntf = (ActionInterface) proxy;

              testIntf.doSelf("我要做業務了!");

              testIntf.getType();

              InterruupIntf intIntf = (InterruupIntf) proxy;

              intIntf.interrup();

              }

              }

              運行最后一個類的MAIN函數,控制臺輸出結果如下:

              +++++++++++調用業務方法之前做其他事情

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

              +++++++++++調用業務方法之前做其他事情

              +++++++++++調用業務方法之前做其他事情

              公用部門

              +++++++++++調用業務方法之前做其他事情

              +++++++++++調用業務方法之前做其他事情

              發呆三分鐘!

              +++++++++++調用業務方法之前做其他事情

              看到結果了。

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

            【Java動態代理的解析】相關文章:

            Java動態代理實現AOP的方法07-22

            Java腳本動態用法06-11

            解析動態NAT配置09-24

            Java中的動態代碼編程06-27

            Java的內存劃分全解析08-02

            java命令行參數解析201608-12

            計算機二級JAVA考點解析10-12

            關于計算機二級JAVA考點解析07-14

            Java與Java web的區別08-10

            2017年計算機二級JAVA考點解析08-03

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看