[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.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.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.바이트 코드 계측을 살펴보십시오. 소스 코드에 액세스 할 필요없이 메소드를 가로 채고 모든 종류의 것을 변경할 수 있습니다 (참조 용으로는 유용하지만). 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
from https://stackoverflow.com/questions/31587931/how-to-intercept-a-method-in-java by cc-by-sa and MIT license