문제

일전에 동료가 나에게 이렇게 말했다. BCEL 그의 설명과 빠른 읽기를 통해 런타임에 바이트 코드를 수정하는 방법을 가장 잘 알 수 있습니다.첫 번째 생각은 위험할 것 같다는 것이었고, 두 번째 생각은 멋있다는 것이었습니다.그러다가 좀 더 생각해보고 그 일을 떠올렸어요. 원숭이 패치에 대한 코딩 호러 게시물 그리고 이것이 기본적으로 같은 것임을 깨달았습니다.BCEL을 실용적인 용도로 사용해 본 사람이 있나요?이것이 기본적으로 런타임 원숭이 패치라는 것이 맞습니까? 아니면 뭔가 빠졌습니까?

도움이 되었습니까?

해결책

이는 기존의 Monkey 패치보다 조금 더 낮은 수준이며, 내가 읽은 바에 따르면 이미 VM에 로드된 클래스는 업데이트되지 않습니다.런타임 클래스를 수정하지 않고 클래스 파일에 다시 저장하는 것만 지원합니다.

다른 팁

BCEL FAQ에서:

큐:bcel과 동적으로 클래스를 만들거나 수정할 수 있습니까?

ㅏ:Bcel에는 Util 패키지, 즉 Classloader 및 Javawrapper에 유용한 클래스가 포함되어 있습니다. proxycreator 예제를 살펴보십시오.

하지만 몽키패칭은...음...논란의 여지가 있으며, 귀하의 언어가 이를 지원하지 않는다면 아마도 사용하지 말아야 할 것입니다.

좋은 사용 사례가 있다면 Jython을 포함시키는 것을 제안해도 될까요?

원숭이 패치로 볼 수도 있습니다.나는 그것을 사용하지 않는 것을 선호하지만(어쩌면 나는 그것에 대한 좋은 사용 사례를 접한 적이 없습니까?) 그것에 익숙해집니다(Spring과 Hibenrate가 그것을 어떻게 사용하는지, 왜 사용하는지 알기 위해).

다음 실제 사례를 참조하세요. Jawk - 컴파일러 모듈.BCEL은 사용자 정의 언어를 "컴파일"하는 데 유용합니다.

BCEL은 Monkey 패치를 지원하지 않으며 단지 바이트코드로 조작하고 사용자 정의 클래스 로더에 로드할 수 있습니다.그러나 당신은 JVM에서 몽키패칭을 구현할 수 있습니다. BCEL 및 Java 에이전트와 같은 라이브러리를 사용합니다.-javaagent 인수로 로드된 Java 에이전트는 계측 API에 액세스하고 로드된 클래스를 수정할 수 있습니다.일부 브리지를 통해 구현하는 것은 어렵지 않습니다.

하지만 기억해:

  • -javaagent를 사용해야 하는 것이 당신이 원하는 것인지 확실하지 않습니다.
  • 어떤 언어에서든 원숭이 패치는 예측하기 어려운 동작으로 이어질 수 있습니다.
  • 방법을 수정할 수 있습니다.이론적으로는 몇 가지 메서드를 추가할 수도 있지만 수정된(패치된) 클래스에 대해 프로젝트를 컴파일해야 합니다.나는 이것이 많은 고통을 초래할 것이며 그럴 가치가 없다고 생각합니다.이를 지원하는 대체 언어가 있습니다(예:Groovy) 또는 유사한 것을 지원합니다(예:Scala의 암시적 변환).
  • Monkey 패치를 사용하는 것보다 API를 잘 설계하는 것이 더 좋습니다.타사 라이브러리에 오히려 유용할 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top