jdk 동적 에이전트 소스 분석 과정

프 록 시 대상 의 생 성 방법 은:
4.567914.이 방법 내부 에 들 어가 한 걸음 한 걸음 내 려 가면 호출 될 것 이다.
4.567914.이 방법 은 대리 류 의 바이트 코드 를 생 성 하 는 데 사용 된다.
다음은 프 록 시 Generator.generateProxyClass()방법 을 호출 하여 로 컬 에 프 록 시 클래스 를 생 성 합 니 다.
1.우선 인터페이스 가 있어 야 한다.

2.프 록 시 클래스 를 만 드 는 방법 은 다음 과 같다.

3.생 성 된 프 록 시 클래스 를 아이디어 에 가 져 와 보기

//
// 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());
    }
  }
}
프 록 시 클래스 의 구조 방법 에 우리 가 실현 한 Invocation Handler 가 들 어 왔 음 을 알 수 있 습 니 다.호출 방법 에 서 는 invoke 방법 을 되 돌려 줍 니 다.
프 록 시 클래스 에서 프 록 시 를 계승 한 것 도 발견 할 수 있 습 니 다.자바 에 서 는 단일 계승 이기 때문에 자바 동적 대 리 는 인 터 페 이 스 를 대상 으로 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기