동료가 다른 날에 BCEL으로 지적했습니다. 그의 설명과 빠른 읽기에서 런타임시 바이트 코드를 수정할 수있는 방법을 가장 잘 알 수 있습니다. 저의 첫 번째 생각은 위험한 소리 였고 두 번째 생각은 시원하게 들렸다는 것이 었습니다. 그런 다음 좀 더 생각해 봤는데 codinghorror post on monkey-patching을 회상하고 이것이 기본적으로 똑같은 것이라는 것을 깨달았습니다. BCEL을 사용하여 실용적인 사람이 있습니까? 나는 이것이 근본적으로 원숭이 패치를 실행하는 것이 옳은가요? 아니면 제가 빠진 것이 있습니까?자바에 BCEL == monkeypatching이 있습니까?
답변
클래식 원숭이 패치보다 조금 더 저급이고 내가 읽은 것으로부터 이미 VM에로드 된 클래스는 업데이트되지 않습니다. 런타임 클래스를 수정하지 않고 클래스 파일에 다시 저장하는 기능 만 지원합니다. BCEL의 자주 묻는 질문에서
:
Q : 내가 만들거나 BCEL 동적으로 클래스를 을 수정할 수 있습니까?
A : BCEL은 폴더의 유틸리티 패키지의 유용한 클래스, 즉 클래스 로더와 JavaWrapper.Take ProxyCreator 예를 살펴 포함되어 있습니다.
하지만 monkeypatching ... awhm ... 논란의 여지가 있습니다. 언어가 지원하지 않는 경우에는 사용하지 않아야합니다.
좋은 유스 케이스가 있다면 자이 썬 embedding을 제안 할 수 있습니까?
원숭이 패치로 볼 수 있습니다. 나는 그것을 사용하지 않기를 바란다. (어쩌면 결코 좋은 유스 케이스에 직면하지 않았을까?). 그러나 Spring과 Hibenrate가 어떻게 사용하는지, 왜 사용하는지에 대해 잘 알고 있어야한다.
현실 세계 예 : Jawk - Compiler Module을 참조하십시오. BCEL은 "컴파일"사용자 정의 언어에 유용합니다.
BCEL은 원숭이 패치를 지원하지 않으며, 단지 바이트 코드로 조작하고 가능하면 사용자 정의 클래스 로더에서로드합니다. 그러나 은 BCEL 및 Java 에이전트와 같은 라이브러리를 사용하여 JVM에서 Monkeypatching을 구현할 수 있습니다. Java 에이전트 (-javaagent 인수로로드 됨)는 Instrumentation API에 액세스하여로드 된 클래스를 수정할 수 있습니다. 일부 다리를 통해 구현하기가 어렵지 않습니다.
그러나 기억 :
- 내가 -javaagent를 사용할 수있는 것은 당신이 원하는 어떤 경우 확실하지 않다.
- 모든 언어에서 원숭이 패치를 적용하면 예측할 수없는 동작이 발생할 수 있습니다.
- 메서드를 수정할 수 있습니다. 이론적으로는 메소드를 추가 할 수도 있지만 수정 된 (패치 된) 클래스에 대해 프로젝트를 컴파일해야합니다. 나는 이것이 많은 고통을 초래할 것이고 그것의 가치가 없다고 생각합니다. 이를 지원하는 대체 언어 (예 : Groovy) 또는 비슷한 것을 지원합니다 (예 : 스칼라에서 암시 적 변환).
- 원숭이 패치를 사용하는 것보다 API를 잘 설계하는 것이 좋습니다. 제 3 자 라이브러리에 유용 할 수 있습니다.
- 1. 어떻게 루아를 자바에 삽입 할 수 있습니까?
- 2. 자바에 C#과 같은 속성이 있습니까?
- 3. SoftHSM 자바에 연결
- 4. 정규식 MetaMap 자바에
- 5. jquery를 자바에 이식하는 것
- 6. 자바에 Ms 액세스 연결
- 7. 자바에 비디오 포함
- 8. 자바에 값이 있는지 확인하기
- 9. 자바에 JNI dll을 임베드
- 10. 자바에 배열에 대한 예제
- 11. 내가 자바에 새로운 JSP
- 12. java.lang.NoClassDefFoundError가 : 조직/아파치/BCEL/클래스 파일/ClassParser
- 13. BCEL 라이브러리를 사용하여 변수 이름 추출
- 14. 임의의 .class 파일로부터 BCEL JavaClass 객체를 생성하십시오.
- 15. FTP 디렉토리 트리를 자바에 업로드
- 16. BGGA는 자바에 대한 해결책으로 폐쇄됩니까?
- 17. 자바에 nutch에 대한 코드를 작성했습니다
- 18. 자바에 대한 기본 정보 문자열
- 19. 자바에 대한 PHP 개발자의 생각
- 20. 어쨌든 객체가 자바에 얼마나 큰지 판단 할 수 있습니까?
- 21. 아이폰/자바에 자바 - 자바 시뮬레이터/프록시?
- 22. JFrame 자바에 2D 배열 쓰기 Java
- 23. 자바에 자바 스크립트 변수를 할당하는 방법
- 24. \ n 개행 문자가 자바에 의해 무시됩니다
- 25. BCEL (Java .class 조작)과 동등하지만 C 또는 C++에 있습니까?
- 26. 자바에 관한 기본 정보 최종 키워드에 대한 설명
- 27. 자바에 대한 객체 지향 접근 이해에 도움이 필요합니다.
- 28. 외부 메모리를 사용하지 않고 자바에 객체 상태 저장
- 29. 내가 어떤 오류가없는 경우 자바에 SQL 구문에 오류가 발생했습니다
- 30. C#에서 자바에 대한 해당 홈페이지 방법은 무엇 자바
요즘 더 많은 사람들이 asm (http://asm.ow2.org/)을 사용하고 있습니다. –