2012-08-06 4 views
3

그냥 똑바로 이러한 바이트 코드처럼 보이는 내 머리를 얻기 위해 .... CGLIB는, ASM은 BCEL (측면)과와 Javassist 런타임시 클래스에 필드를 추가 사용에 는 자바 클래스에 필드를 추가

을 보았다 manipulators는 실제 클래스를 업데이트하지 않고 사용자가 수정 사항을 덤프 할 수있게합니다 (예 : CGLib 및 writeFile 메소드). (a) BCEL을 사용하여 InputStream을 수행하는 대신 클래스를로드하고 (b) 클래스를 업데이트하는 해결책을 찾고 싶었습니다.

아마도 이것이 정상입니까? 사람들은 대개 프록시를 만들고 프록시를 전달합니까?

내가 원하는 것은 특정 주석이있는 필드 (속성 아님)를 찾는 프레임 워크에 객체를 전달하기 전에 필드 (참고 : get/set 메소드를 통해 속성이 아닌)를 추가하는 것입니다. 그래서 "클라이언트"가 여분의 필드를 삽입하고자하는 대상 클래스를 만듭니다. 이러한 객체를 조작하려는 서비스 계층에 대한 AOP 호출을 가로 채기.

답변

2

계측으로 클래스를 재정의 할 수 있습니다. 그러나 일반적인 제한은 사용 된 필드를 변경할 수 없다는 것입니다. 이는 일단 객체가 생성되면 객체의 내용을 변경 (또는 추가) 할 수 없기 때문입니다. 당신이 제안으로 귀하의 경우 당신이 할 수에서

,

  • 그러나 프록시 인터페이스 할 필요가 프록시를 만듭니다.
  • 추가 필드가있는 서브 클래스를 만듭니다.
  • 클래스가로드되기 전에 필드를 추가하십시오.
+0

point (3) 클래스 로더를 가로 채고 자한다고 가정합니다. 예제 또는 예제 링크? 포인트 (2)는 나를 위해 작동하지 않을 것이지만 포인트 (1)은 CGLib가 일종의 필드 가로 채기를하는 것처럼 보입니다. CGLib에 대한 예제를 찾는 것은 악몽이기 때문에 프록시를 사용하지 않는 것은 인터페이스가되어야합니다. –

+0

클래스를 사용하기 전에로드하려는 클래스를 알고 있다면'defineClass'를 호출하여로드 할 수 있습니다. 동적 인 것이 필요한 경우, findClass를 오버라이드 (override)하는 독자적인 ClassLoader를 작성할 수 있습니다. 또는 클래스 로더를 변경하지 않고 클래스 로딩을 가로채는'Instrumentation'을 사용할 수 있습니다. 대부분의 도구는 프록시가 인터페이스가되어야합니다. 'Proxy.newProxyInstance (classLoader, interfaces, handler) ' –

+0

https://github.com/kreyssel/maven-examples/blob/master/javaagent/src/main/java/org/kreyssel/tools/loggingagent/LoggerAgent를 찾았습니다. 자바 어디에 에이전트를 통해 클래스를 변환 할 수 있습니다. 클래스 로더에 대한 참조를 가져올 때 이것이 어떻게 이루어 지도록 이끌 수 있습니까? –