Java 반사 구현 Aop 에이전트 상세 정보

2783 단어 javaaop반사
반사를 이용하여 JDK의 동적 에이전트, 즉 AOP의 AOP 에이전트를 생성하여 목표 대상을 대체하고 코드에 증강을 직입한다.
프록시 인터페이스 정의
JDKf 동적 에이전트는 인터페이스에 동적 에이전트만 만들 수 있기 때문에 먼저 인터페이스를 정의합니다. 데이터의 Save 방법에 사무 처리를 추가해야 한다고 가정하면 UserDao 인터페이스가 있습니다. 그 안에 Save 방법이 있습니다. 코드는 다음과 같습니다.

public interface UserDao {
  public void save();
}
정의 에이전트 구현
다음은 인터페이스 정의를 실현하는 Save 방법입니다. 우리는 아래의 코드를 사용하여 실현합니다.

public class UserDaoImpl implements UserDao {

  @Override
  public void save() {
    System.out.println("I am save user....");
  }

}
증강 코드 정의
사용자를 저장하기 전에 사무를 열고 사용자를 저장한 후에 사무를 제출하며 증강 코드에서 두 가지 방법인 before () 와after () 를 정의합니다. 각각save () 방법의 실행이 시작되기 전과 실행된 후입니다.

public class UserTx {
  public void before(){
    System.out.println("before save.....");
  }
  public void after(){
    System.out.println("after save......");
  }
}
Invocation handler 정의
handler를 정의해야 하는 이유는 동적 에이전트를 실행할 때 실제적으로 실행하는 것은handler 안의 invoke () 방법이기 때문이다. 그러면 우리는 invoke () 방법에서 방법의 내용을 사용자 정의하여 에이전트와 강화된 논리와 효과를 얻을 수 있다.

public class UserDaoInvocationHandler implements InvocationHandler {
  /
    
   /
  private Object proxyObj;
  /
    
   @param proxyObj
   */
  public void setProxyObj(Object proxyObj) {
    this.proxyObj = proxyObj;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    UserTx tx = new UserTx();
    tx.before();
    Object resultObj = method.invoke(proxyObj, args);
    tx.after();
    return resultObj;
  }
}
테스트 결과
위에서 모든 것을 정의했습니다. 우리는 실제적으로 우리가 지정한 대상을 동적 대리하고 대리 후의 대상으로 우리가 집행해야 할 방법을 집행하여 대리가 성공했는지 검증합니다.

import java.lang.reflect.Proxy;
public class ProxyTst {
  public static void main(String[] args) {
    // proxy object
    UserDao target = new UserDaoImpl();
    // invocation handler
    UserDaoInvocationHandler handler = new UserDaoInvocationHandler();
    handler.setProxyObj(target);
    // proxy
    UserDao targeted = (UserDao) Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        handler);
    // execute proxyed object
    targeted.save();
  }
}
위의 코드를 실행한 후에 우리는 컨트롤러에서 아래의 출력을 볼 수 있습니다. 이것은 UserDao가 성공적으로 에이전트되었음을 증명하는 동시에 우리는 우리의 프로그램에 성공적으로 사무 기능을 추가했습니다.

before save.....
I am save user....
after save......
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기