2010-01-25 5 views
8

Javm을 -javaagent : spring-instrumentation.jar와 함께 실행할 때 (스택 트레이스에서) 주목할만한 누군가 JAXB 주석 클래스에는 작성하지 않은 이상한 새 메서드가 있습니다. SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.getJAXB는 바이트 코드 계측을 사용합니까?

그렇다면 jaxb는 바이트 코드 계측을 사용할 수있을 때이를 사용합니까? 이 기능에 대해 더 자세히 읽을 수있는 곳은 어디입니까?

덕분에, Yuval 교수

답변

12

그냥 추가 :

당신이 보는 무엇을 (SomeJaxbAnnotatedClass $ JaxbAccessor ...)를 JAXB 참조 구현에 의해 동적으로 생성되는 내부 클래스입니다. 런타임시 반사 오버 헤드를 방지하기 위해 reflection의 구체적인 구현에 대한 바이트 코드가 생성되어 반향을 사용하여 보호 액세스 수정자를 우회 한 후 ClassLoader.defineClass (String, byte [], int, int)를 호출하여 현재 클래스 로더에 삽입됩니다. defineClass 메소드의

따라서 JAXB 참조 구현은 기존 클래스를 수정한다는 의미에서 바이트 코드를 계측하지 않지만 최적화 된 런타임 성능을위한 새로운 클래스를 생성합니다.

+0

(+1) 추가되었습니다. – skaffman

+0

이 점을 분명히 해 주셔서 감사합니다. 나는 내부 클래스를 추가 된 메서드와 혼동하고 스프링 - 계측이이 작업과 관련이있을 것이라고 생각했습니다. 당신이 묘사하는 것이 훨씬 의미가 있습니다 :) –

1

내가 알기로는, JAXB는 사용자가 제공 한 XML을 기반으로 클래스를 생성하는 반사를 사용합니다 (I 일부 시간에 그것을 사용하지 않은 불구을, 그래서 그들은 자신의 방법론을 변경되었을 수 있습니다).

반면에 JiBX은 바이트 코드 계측을 수행하기 위해 BCEL을 사용합니다. 여기에 관한 기사는 http://www.ibm.com/developerworks/java/library/j-cwt09065/입니다.

+0

나는 JIBX가 그것을 사용하고 포스트 컴파일을 실행해야 할 때부터 매 순간마다 JAXB가 바이트 코드 주입과 같이 보이는 것을하고있는 것을보고 놀랐다.하지만 나는 틀렸다고 생각한다. –

8

JaxbContext이 시작되면 많은 양의 반사 작업을 수행하여 나중에 필요한 모든 항목을 사전 캐시합니다. 이는 성능상의 이유로 수행됩니다. 그것이 정확히 무엇인지 모르겠지만, 일종의 런타임 클래스 생성 로직을 수행 할 것으로 기대합니다. 원시 리플렉션보다 런타임이 빠르기 때문입니다.

흥미롭게도 런타임 성능을 희생시키면서 컨텍스트의 시작을 향상시키는 문서화되지 않은 시스템 속성을 설정하여이 동작을 끌 수 있습니다.

편집 : 이것이 Sun JAXB 참조 구현이 커버하고있는 내용이며 JAXB 스펙의 일부는 아니라는 점을 강조합니다. 다른 구현은 자유롭게 선택할 수 있습니다. skaffman의 게시물에

+1

+1에 대한 언급 다르게 구현 된 다른 구현이있을 수 있습니다! –

0

skaffman에서 언급 한 바와 같이 당신은 시스템 속성을 설정하여 모든 내부 클래스의 생성을 해제 할 수 있습니다 com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot을 물론 = 사실

그것은 문서화되지 않았지만 수년 동안 변하지 않았습니다.