2008-09-03 4 views
3

동료가 다른 날에 BCEL으로 지적했습니다. 그의 설명과 빠른 읽기에서 런타임시 바이트 코드를 수정할 수있는 방법을 가장 잘 알 수 있습니다. 저의 첫 번째 생각은 위험한 소리 였고 두 번째 생각은 시원하게 들렸다는 것이 었습니다. 그런 다음 좀 더 생각해 봤는데 codinghorror post on monkey-patching을 회상하고 이것이 기본적으로 똑같은 것이라는 것을 깨달았습니다. BCEL을 사용하여 실용적인 사람이 있습니까? 나는 이것이 근본적으로 원숭이 패치를 실행하는 것이 옳은가요? 아니면 제가 빠진 것이 있습니까?자바에 BCEL == monkeypatching이 있습니까?

+0

요즘 더 많은 사람들이 asm (http://asm.ow2.org/)을 사용하고 있습니다. –

답변

1

클래식 원숭이 패치보다 조금 더 저급이고 내가 읽은 것으로부터 이미 VM에로드 된 클래스는 업데이트되지 않습니다. 런타임 클래스를 수정하지 않고 클래스 파일에 다시 저장하는 기능 만 지원합니다. BCEL의 자주 묻는 질문에서

3

:

Q : 내가 만들거나 BCEL 동적으로 클래스를 을 수정할 수 있습니까?

A : BCEL은 폴더의 유틸리티 패키지의 유용한 클래스, 즉 클래스 로더와 JavaWrapper.Take ProxyCreator 예를 살펴 포함되어 있습니다.

하지만 monkeypatching ... awhm ... 논란의 여지가 있습니다. 언어가 지원하지 않는 경우에는 사용하지 않아야합니다.

좋은 유스 케이스가 있다면 자이 썬 embedding을 제안 할 수 있습니까?

0

원숭이 패치로 볼 수 있습니다. 나는 그것을 사용하지 않기를 바란다. (어쩌면 결코 좋은 유스 케이스에 직면하지 않았을까?). 그러나 Spring과 Hibenrate가 어떻게 사용하는지, 왜 사용하는지에 대해 잘 알고 있어야한다.

0

현실 세계 예 : Jawk - Compiler Module을 참조하십시오. BCEL은 "컴파일"사용자 정의 언어에 유용합니다.

0

BCEL은 원숭이 패치를 지원하지 않으며, 단지 바이트 코드로 조작하고 가능하면 사용자 정의 클래스 로더에서로드합니다. 그러나 은 BCEL 및 Java 에이전트와 같은 라이브러리를 사용하여 JVM에서 Monkeypatching을 구현할 수 있습니다. Java 에이전트 (-javaagent 인수로로드 됨)는 Instrumentation API에 액세스하여로드 된 클래스를 수정할 수 있습니다. 일부 다리를 통해 구현하기가 어렵지 않습니다.

그러나 기억 :

  • 내가 -javaagent를 사용할 수있는 것은 당신이 원하는 어떤 경우 확실하지 않다.
  • 모든 언어에서 원숭이 패치를 적용하면 예측할 수없는 동작이 발생할 수 있습니다.
  • 메서드를 수정할 수 있습니다. 이론적으로는 메소드를 추가 할 수도 있지만 수정 된 (패치 된) 클래스에 대해 프로젝트를 컴파일해야합니다. 나는 이것이 많은 고통을 초래할 것이고 그것의 가치가 없다고 생각합니다. 이를 지원하는 대체 언어 (예 : Groovy) 또는 비슷한 것을 지원합니다 (예 : 스칼라에서 암시 적 변환).
  • 원숭이 패치를 사용하는 것보다 API를 잘 설계하는 것이 좋습니다. 제 3 자 라이브러리에 유용 할 수 있습니다.
관련 문제