2015-01-11 9 views
6

가정하자 나는 방법 m 있습니다Byte Buddy는 메서드의 로컬 변수 이름에 액세스 할 수 있습니까?

public void m() { 
    String foo = "foo"; 
    int bar = 0; 
    doSomething(foo, bar); 
} 

내가 m에서 doSomething를 호출 할 때, 그것은 자동으로 HashMapfoobar의 값을 넣을 수 있도록 악기의 코드를 ByteBuddy를 사용하려면를 거의 뭔가 모양은 다음과 같습니다.

ByteBuddy를 통해이 계측을 수행 할 수 있습니까?

+0

음, ASM을 사용하여, 그것은 확실히 가능하지만, 이것은 당신이 듣고 싶은 것이 아닙니다 ... – fge

+0

이 경우에 ASM 솔루션을 적용 할 수 있습니까? thx ... Green –

답변

1

이런 식으로 재정의 방법 m을 수행하는 내장 된 방법이 있습니다. 그러나 Byte Buddy는 ASM API를 자발적으로 노출하여 Byte Buddy를 구현합니다. ASM은 이것을 수행하는 방법을 보여줄 수있는 매우 광범위한 문서를 제공합니다. 그러나 나는 그것이 꽤 많은 코드가 될 것이라고 말할 수 있습니다. 디버그 기호를 사용하여 모든 메소드를 컴파일해야합니다. 그렇지 않으면이 내부 변수를 런타임에 사용할 수 없습니다.

그래도이 작업을 수행 하시겠습니까? 정확한 유스 케이스를 모르면 나쁜 생각 인 것 같습니다. 이 솔루션을 구현하면 로컬 변수의 이름을 구현 세부 사항이 아닌 응용 프로그램의 일부로 만들 수 있습니다.

그러므로 나는 doSomething 방법을 사용하는 것이 좋습니다. 이 충분할의 yourn 쉽게 같은 인터셉터를 사용하여 바이트 버디에서 수행되는 것을겠습니까 다음

class Interceptor { 
    void intercept(@Origin Method method, @AllArguments Object[] args) { 
    int index = 0; 
    for(Parameter p : method.getParameters()) { 
     context.add(p.getName(), args[index++]); 
    } 
    } 
} 

다음과 같이 인터셉터 후 사용할 수 :

MethodDelegation.to(new Interceptor()).andThen(SuperMethodCall.INSTANCE); 
+0

'doSomething'은 임의의 인수를 취할 것입니다 :'void doSomething (Object ... args)'그래서 그 메소드를 인스트루먼트 할 수 없습니다. 시나리오는 Controller 메소드 프로세서를 구현하여 사용자가'render (foo, bar)'를 호출 할 때 밑줄 템플릿보기 코드 –

+0

에서 참조되는 렌더 인자 맵에 자동으로'foo'와'bar'를 넣습니다.이 경우 , ASM을 사용하고 디버그 기호를 추가해야합니다. 인터셉터에 대한 가장 작은 엔티티 인 Byte Buddy는 방법이라는 것을 알고 있으며, 앞으로 이것이 바뀔 것이라고 생각하지 않습니다. 인프라를 제공하는 데 Byte Buddy를 사용할 수 있지만 ASM을 사용해야합니다. –