2017-01-19 1 views
2

ByteBuddy를 사용하여이 클래스에 메소드 인터셉터를 추가하기 위해 동적으로 하위 클래스를 만듭니다. 지금까지 모든 것이 작동하지만 ByteBuddy는 모든 메서드에 대해 final 접근 자 메서드를 만듭니다. 지금은 봄과 함께 ByteBuddy을 사용할 때 난 내가 봄 로그 수준을 거절 할 수 있다는 것을 알고 형태최종 접근 자 메서드의 생성을 피하십시오.

[main] INFO org.springframework.aop.framework.CglibAopProxy - Unable to proxy method [final void com.tngtech.jgiven.integration.spring.test.proxy.GivenTestStageWithAspect$ByteBuddy$aMzxnEax.should_say_hello$accessor$7OjlyLlO()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance. 

의 메시지의 톤을 얻을. 그러나 라이브러리를 개발할 때 라이브러리의 모든 사용자는 내가 피하고 싶은 Spring 로그 설정을 변경해야합니다. 그래서 문제는 접근 자의 생성을 피할 수 있는지 또는 ByteBuddy가 이들을 만들지 않도록 구성 할 수 있는지 여부입니다. final.

+0

나는 mockito 프레임 워크의 ByteBuddy를 알고 있습니다. https://github.com/raphw/byte-buddy/issues/3와 raphw가 제공하는 링크 –

+0

을 참조하십시오. Spring을 사용할 때 ByteBuddy를 사용하여 인터셉터를 추가하는 이유는 무엇입니까? 그걸 위해 [Spring AOP] (https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html)를 사용하는 것이 더 좋지 않습니까? – Andreas

+0

라이브러리를 개발할 때 Spring을 직접 사용하지 않습니다. 이 문제는 라이브러리가 Spring 애플리케이션의 컨텍스트에서 사용될 때만 발생한다. –

답변

1

이러한 방법을 최종으로 표시하는 아이디어는 프록시에서 사용을 중단시킬 프록시에 의해 재정의되지 않도록하는 것입니다. 동시에 그들은 호출 클래스 외부에서 허용되지 않는 invokespecial 호출을 포함하기 때문에 필요합니다. 이 경우

, 나는 문제도 프록시 두 가지 이유에서 그 방법에 시도하지해야하는 봄에 놓여 있다고 주장 할 것이다 : 방법은 패키지 사립

  1. 을; 프록시 클래스에 대해 종종 제공되지 않는 동일한 클래스 로더 내에서 가상 클래스로만 파견되기 때문에 최종 클래스가 아니더라도 안정적으로 재정의 할 수 없습니다.
  2. 이 메서드는 합성으로 표시되어, 변경하지 않아야하는 인프라 방법을 나타냅니다.

기본적으로 이러한 메서드를 제외 할 것을 제안합니다. 이러한 메소드를 프록시하는 것은 거의 의미가 없습니다.

+2

나는 이미 당신이 그런 대답을 줄 것을 두려워했다 ;-). 나는 그러한 경고를 인쇄하기 전에 Spring이 더 지능적이어야한다는 것에 완전히 동의한다. 그러나 문제는 라이브러리 개발자 관점에서 사용자가 Spring 구성으로 수행중인 작업을 수정할 가능성이 없다는 것입니다. 사용자에게 LOG 구성 및/또는 Spring 구성을 적용하도록 알려주는 것은 약간 불만 스럽습니다. –

+0

나는 그것을 이해하고 있으며 좌절감을 안다. 나는 많은 Spring과 같은 많은 JVM 언어들이 합성 접근자를 생성했기 때문에 Spring과 함께이 문제를 제기 할 것입니다. Byte Buddy 특정 문제가 아니라 Spring이 내놓아야 할 문제입니다. 문제를 제기 했습니까? 패키지 개인, 합성 방법을 제외하면 매우 합리적인 것 같습니다. –

+0

예, ByteBuddy가 여기에 실수하지 않는다는 것에 동의합니다. Spring이 불평하지 않도록 접근 자의 생성을 수정하는 ByteBuddy의 방법이 있었으면합니다. 나는 여기에서 할 수있는 것이별로 없다고 생각한다. Spring을 상대로 버그를 제기하는 것은 분명히 내가 할 일이지만, 그 대답은 다음과 같을 것이라는 두려움이있다 : 로깅을 끄기 ;-). 답변 해주셔서 감사합니다! –