문제

응용 프로그램에서 호출 된 모든 방법을 가로 채는 것이 가능합니까? 나는 그들과 함께 무언가를하고 있고, 그들이 실행하도록하고 싶습니다. 나는이 행동을 무시하려고 노력했다 Object.metaClass.invokeMethod, 그러나 작동하지 않는 것 같습니다.

이것은 가능합니까?

도움이 되었습니까?

해결책

당신은 보셨습니까? 그루비 AOP? 아주 적습니다 선적 서류 비치, 그러나 그것은 당신이 Pointcuts와 조언을 SaperJ와 개념적으로 유사한 방식으로 정의 할 수 있습니다. 살펴보십시오 단위 테스트 더 많은 예를 위해

아래 예제는 모든짜리 통화와 일치하며 진행하기 전에 조언을 적용합니다.

// aspect MyAspect
class MyAspect {
  static aspect = {
    //match all calls to all calls to all types in all packages
    def pc = pcall("*.*.*")

    //apply around advice to the matched calls
    around(pc) { ctx ->
      println ctx.args[0]
      println ctx.args.length
      return proceed(ctx.args)
    }
  }
}
// class T
class T {
  def test() {
    println "hello"
  }
}
// Script starts here
weave MyAspect.class
new T().test()
unweave MyAspect.class

다른 팁

우선, 우선 Object.metaClass.invokeMethod Groovy가 유형 X에 대한 메소드 호출을 해결하려고 할 때는 X의 메타 클라스를 확인하지만 부모 클래스 (ES)의 메타 클라스는 아닙니다. 예를 들어, 다음 코드는 "메소드 intvalue가 인터셉트 된"인쇄합니다.

Integer.metaClass.invokeMethod = {def name, def args ->
  System.out.println("method $name intercepted")
}

6.intValue()

// Reset the metaClass  
Integer.metaClass = null  

그러나이 코드는 다음과 같습니다.

Object.metaClass.invokeMethod = {def name, def args ->
  System.out.println("method $name intercepted")
}

6.intValue()

// Reset the metaClass  
Object.metaClass = null

귀하의 질문은 "응용 프로그램에서 호출 된 모든 방법을 가로 채는 것이 가능합니까?"였지만 원하는지 여부에 대해 조금 더 정확할 수 있습니다.

  • 그루비 방법, 자바 방법 또는 둘 다에 대한 호출을 가로 채기
  • 호출을 가로 채기 만하면됩니다 당신의 Groovy/Java 방법 또는 Groovy/Java Library 클래스에 대한 호출을 가로 채기

예를 들어, 그루비 클래스에 대한 통화 만 인터셉트하려면 클래스를 변경하여 구현할 수 있습니다. groovyinterception. 이를 통해 해당 클래스에서 호출 된 모든 방법에 대해 invokemethod ()가 호출되도록합니다. 가로 채기의 특성 (즉, 호출 된 메소드를 호출하기 전/후에 수행하려는 작업이 모든 클래스에서 동일하면 정의 할 수 있습니다. invokeMethod() 별도의 클래스와 사용 @Mixin 모든 수업에 적용합니다.

또는 Java 클래스에 대한 통화를 가로 채려면 위임 메타 클래스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top