91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jdk動態代理源碼分析過程

發布時間:2020-10-11 09:08:19 來源:腳本之家 閱讀:203 作者:yongan 欄目:編程語言

代理對象的生成方法是:

Proxy.newProxyInstance(...) ,進入這個方法內部,一步一步往下走會發現會調用

ProxyGenerator.generateProxyClass() ,這個方法用來生成代理類的字節碼。

下面通過調用 ProxyGenerator.generateProxyClass()方法在本地生成代理類。

1.首先要有一個接口

jdk動態代理源碼分析過程

2.生成代理類的方法如下

jdk動態代理源碼分析過程

3.將生成的代理類導入到idea中查看是長這樣

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import com.example.springboottest.config.OrderService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;

protected static class $OrderService extends Proxy implements OrderService {
  private static Method m1;
  private static Method m3;
  private static Method m2;
  private static Method m0;

  public $OrderService(InvocationHandler var1) throws {
    super(var1);
  }

  public final boolean equals(Object var1) throws {
    try {
      return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
    } catch (RuntimeException | Error var3) {
      throw var3;
    } catch (Throwable var4) {
      throw new UndeclaredThrowableException(var4);
    }
  }

  public final void query() throws {
    try {
      super.h.invoke(this, m3, (Object[])null);
    } catch (RuntimeException | Error var2) {
      throw var2;
    } catch (Throwable var3) {
      throw new UndeclaredThrowableException(var3);
    }
  }

  public final String toString() throws {
    try {
      return (String)super.h.invoke(this, m2, (Object[])null);
    } catch (RuntimeException | Error var2) {
      throw var2;
    } catch (Throwable var3) {
      throw new UndeclaredThrowableException(var3);
    }
  }

  public final int hashCode() throws {
    try {
      return (Integer)super.h.invoke(this, m0, (Object[])null);
    } catch (RuntimeException | Error var2) {
      throw var2;
    } catch (Throwable var3) {
      throw new UndeclaredThrowableException(var3);
    }
  }

  static {
    try {
      m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
      m3 = Class.forName("com.example.springboottest.config.OrderService").getMethod("query");
      m2 = Class.forName("java.lang.Object").getMethod("toString");
      m0 = Class.forName("java.lang.Object").getMethod("hashCode");
    } catch (NoSuchMethodException var2) {
      throw new NoSuchMethodError(var2.getMessage());
    } catch (ClassNotFoundException var3) {
      throw new NoClassDefFoundError(var3.getMessage());
    }
  }
}

可以發現在代理類中的構造方法中傳入了我們實現的InvocationHandler,在調用方法時會回調invoke方法。

還可以發現代理類中繼承了Proxy,由于java中是單繼承的,所以java動態代理是針對接口的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荔波县| 大同县| 苍山县| 宁河县| 保亭| 河源市| 武夷山市| 嵩明县| 长泰县| 唐海县| 九龙县| 浙江省| 始兴县| 大丰市| 龙州县| 策勒县| 翁牛特旗| 聊城市| 博客| 宣威市| 高雄县| 自治县| 龙游县| 桐城市| 云浮市| 广河县| 塘沽区| 林芝县| 南江县| 靖边县| 咸阳市| 合江县| 电白县| 勃利县| 阆中市| 淳化县| 永安市| 屯昌县| 衡南县| 大庆市| 崇信县|