복붙노트

[SPRING] 자바에서 메서드를 인터셉트하는 방법

SPRING

자바에서 메서드를 인터셉트하는 방법

방법은 다음과 같습니다.

public static boolean startModule(Module mod, ServletContext servletContext, boolean delayContextRefresh)

다음은 java 파일의 메소드 호출입니다.

WebModuleUtil.startModule(module, getServletContext(), false);

이러한 파일을 변경할 수는 없지만 메서드를 가로 채고 일부 코드를 추가하려고합니다 (매개 변수에도 액세스 할 수 있음).

코드 다른 Java 파일에서 작성했지만 성공하지 못했습니다.

public void main(String[] args) throws Exception {

    Module module = null;
    WebModuleUtil wmb = new WebModuleUtil();
    ProxyFactory pf = new ProxyFactory(wmb);
    pf.addAdvice(new MethodInterceptor() {

        public Object invoke(MethodInvocation invocation) throws Throwable {
            if (invocation.getMethod().getName().startsWith("start")) {
                System.out.println("method " + invocation.getMethod() + " is called on " + invocation.getThis()
                        + " with args " + invocation.getArguments());
                System.out.println("********************");
                Object ret = invocation.proceed();
                System.out.println("method " + invocation.getMethod() + " returns " + ret);
                return ret;
            }
            return null;
        }
    });

    WebModuleUtil proxy = (WebModuleUtil) pf.getProxy();
    proxy.startModule(module, getServletContext(), false);      
}

private static ServletContext getServletContext() {
    // TODO Auto-generated method stub
    return null;
}

해결법

  1. ==============================

    1.aop 프로그래밍을 사용하십시오. 예를 들어 AspectJ에 관해 뭔가 읽으려고 시도하십시오.

    aop 프로그래밍을 사용하십시오. 예를 들어 AspectJ에 관해 뭔가 읽으려고 시도하십시오.

    예 코드 :

    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Service;
    
    @Aspect
    @Service
    public class AspectDemo {
    
    @Around("aop1()" ) 
    public Object intercept(ProceedingJoinPoint joinPoint) throws Throwable {
       for (Object obj : joinPoint.getArgs()) {
          LOG.debug(obj);
       }
    }
    
    @Pointcut("execution(*my.example.packcage.startModule.*(..))")
      public void aop1() {
    }
    
  2. ==============================

    2.Aspect Oriented Programming (AOP)은 이러한 목적으로 만들어졌으며, AspectJ :

    Aspect Oriented Programming (AOP)은 이러한 목적으로 만들어졌으며, AspectJ :

    또는 Spring을 사용하면서 Spring 2.0 AOP를 사용할 수 있습니다.

    다음과 같이 Aspect를 선언하는 방법입니다.

    @Aspect
    public class NotVeryUsefulAspect {
    
    }
    

    그리고 이것은 pointCut을 선언하는 방법입니다.

    @Pointcut("execution(* transfer(..))")// the pointcut expression
    private void anyOldTransfer() {}// the pointcut signature
    

    자세한 내용은 다음 자습서를 참조하십시오.

  3. ==============================

    3.바이트 코드 계측을 살펴보십시오. 소스 코드에 액세스 할 필요없이 메소드를 가로 채고 모든 종류의 것을 변경할 수 있습니다 (참조 용으로는 유용하지만). Javassist는 JVM 에이전트와 함께 사용할 수있는 훌륭한 라이브러리입니다.

    바이트 코드 계측을 살펴보십시오. 소스 코드에 액세스 할 필요없이 메소드를 가로 채고 모든 종류의 것을 변경할 수 있습니다 (참조 용으로는 유용하지만). Javassist는 JVM 에이전트와 함께 사용할 수있는 훌륭한 라이브러리입니다.

    Cglib은 프록시를 사용하여 대상 코드의 동작을 변경하는 또 다른 라이브러리이지만 javassist를 사용하기가 더 쉽습니다.

    이 튜토리얼은 좋은 시작이다 : http://rafaeloltra.com/developing-a-jvm-agent-for-bytecode-instrumentation-with-javassist-pt1/. Javassist 문서뿐만 아니라 http://jboss-javassist.github.io/javassist/tutorial/tutorial.html

  4. from https://stackoverflow.com/questions/31587931/how-to-intercept-a-method-in-java by cc-by-sa and MIT license