자바 동적 에이전트 의 2 가지 실현 방식 을 자세히 설명 합 니 다.

자바 의 동적 대 리 는 자바 를 연결 하 는 api 에 설명 이 있 습 니 다.여 기 는 쓰 지 않 습 니 다.내 가 이해 하 는 대리:
특정 인터페이스 에서 특정 방법의 기능 을 확장 하 는 것 이 에이전트 입 니 다.프 록 시 는 프 록 시 인 스 턴 스 와 연 결 된 호출 처리 프로그램 대상 호출 방법 입 니 다.
다음은 하나의 예 를 통 해 보 겠 습 니 다.
인터페이스:

public interface Num {
  void show();
  
  int getNum();
  
  int getProduct(int x);
}
구현 클래스:

public class MyNum implements Num {
  @Override
  public int getNum() {
    return 3;
  }
  
  @Override
  public int getProduct(int x) {
    return x;
  }

  @Override
  public void show() {
    System.out.println("        99");
  }
}

Method 의 invoke 방법 이 api 에서 어떻게 묘사 되 었 는 지 먼저 보 세 요
즉,호출 처리 프로그램 이 인터페이스의 실현 대상 에 대해 Method 대상 을 호출 하여 표시 하 는 바 텀 방법 이다.
첫 번 째 대 리 를 실현 하 는 방식:

public class NumProxy {
  private Object num;

  //                
  public NumProxy(Object num) {
    this.num = num;
  }

  public Object getNumByProxy(){
    Object numProxy = Proxy.newProxyInstance(num.getClass().getClassLoader(), new Class[]{Num.class}, new InvocationHandler() {
      /**
       * method:                   Method   。                
       * args:               
       */
      @Override
      public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable {
        Object obj = null;
        System.out.println("         ");
        String methodName = method.getName();
        if("getProduct".equals(methodName)){
          obj = method.invoke(num, args);
          obj = (Integer) obj * 2;
          System.out.println("proxy: getProduct()  ");
        }
        else if("show".equals(methodName)){
          obj = method.invoke(num, args);
          System.out.println("proxy: show()  ");
        }
        return obj;
      }
    });
    return numProxy;
  }
}

두 번 째 대리 실현 방식:Invocation Handler 인 터 페 이 스 를 실현 합 니 다.

public class NumProxyImpl implements InvocationHandler {
  //            ,     Object
  private Num num;
  
  public NumProxyImpl(Num num){
    this.num = num;
  }
  
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    Object obj = null;
    String methodName = method.getName();
    if("getProduct".equals(methodName)){
      System.out.println("proxy: getProduct()  ");
      obj = method.invoke(num, args);
      obj = (Integer) obj * 2;
      System.out.println("proxy: getProduct()  ");
    }else if("show".equals(methodName)){
      System.out.println("proxy: show()  ");
      obj = method.invoke(num, args);
      System.out.println("proxy: show()  ");
    }
    return obj;
  }
}
테스트 코드:

public class TestNum {
  public static void main(String[] args) {
    //        
    NumProxy np = new NumProxy(new MyNum());
    Num numProxy = (Num) np.getNumByProxy();
    int x = numProxy.getProduct(2);
    System.out.println(x);
    numProxy.show();
    
    System.out.println("----------------");
    NumProxyImpl npi = new NumProxyImpl(new MyNum());
    Num numPro = (Num) Proxy.newProxyInstance(Num.class.getClassLoader(), new Class[]{Num.class}, npi);
    int n = numPro.getProduct(3);
    System.out.println(n);
    numPro.show();
  }
}
콘 솔 결과:

두 번 째 방식 은 약간 의 심 스 럽 습 니 다.여러분 이 있 는 지 모 르 겠 습 니 다.그것 은 NumProxyImpl 의 invoke 방법 을 표시 하지 않 았 는데 실 행 했 습 니 다.음,이 건 직접 내 려 가 보 세 요.
귀 찮 게 하고 싶 지 않 은 건 기억 만 하면 돼.
예 를 들 어 인 코딩 의 처 리 는 에이 전 트 를 사용 할 수 있 고 다음 에 예 를 들 어 쓸 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기