Groovy를 사용하여 Java 응용 프로그램의 모든 방법을 어떻게 실행할 수 있습니까?
-
22-07-2019 - |
문제
응용 프로그램에서 호출 된 모든 방법을 가로 채는 것이 가능합니까? 나는 그들과 함께 무언가를하고 있고, 그들이 실행하도록하고 싶습니다. 나는이 행동을 무시하려고 노력했다 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 클래스에 대한 통화를 가로 채려면 위임 메타 클래스.