2017-11-11 6 views
-1

계측 목적으로 java.lang.string에 변수를 추가해야합니다. 할 수 있습니까? 내가 할 때 다음과 같은 예외가 발생하고 있습니다.Java 코어 클래스 계측

java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields) 
    at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method) 
    at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:170) 
    at com.javapapers.java.instrumentation.DurationAgent.premain(DurationAgent.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386) 
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401) 
+0

@ M0ns1f 스택을 포맷하지 마십시오. 코드를 대신 사용하십시오. –

+0

@JimGarrison okey, 다음 번에 무엇이 될지 – M0ns1f

답변

1

실제로 예외에는 이미 모든 관련 정보가 포함되어 있습니다. 예외 유형 이름이 java.lang.UnsupportedOperationException 인 경우 "지원되지 않음 작업"이 포함되어 있으며 해당 메시지는 지원되지 않는 작업의 이름을 지정합니다. "스키마 변경 시도 (필드 추가/제거)"입니다.

즉, 클래스 재정의 중에 필드를 추가하거나 제거하는 것은 핵심 클래스 나 다른 클래스에서 시도한 것처럼 HotSpot JVM에서 지원되지 않습니다. the documentation 상태 :

재정의를 통해 메서드 본문, 상수 풀 및 특성이 변경 될 수 있습니다. 재정의는 필드 또는 메서드를 추가, 제거 또는 이름을 바꾸거나 메서드의 서명을 변경하거나 상속을 변경하면 안됩니다. 이러한 제한 사항은 이후 버전에서 해제 될 수 있습니다. 다른 클래스,로드 시간 계측도 에이전트를로드하기 전에 존재해야합니다 java.lang.String 같은 중요한 클래스를 위해, 그러나, 런타임에서의 첫 번째 정의 전에 선언 된 필드를 변경, 도움이 될 수 있습니다에 대한

, 즉 옵션이 아닙니다.

String 클래스를 변경하는 유일한 방법은 JVM 시작시 부트 스트랩 클래스 경로에 대체 구현을 추가하는 것입니다. 그러나 이러한 방식으로 구성을 변경하지 않는 것이 좋습니다. 이러한 기본 클래스로 재생할 때 전체 JVM을 너무 쉽게 깨뜨릴 수 있습니다. 심지어 JVM (버전) 하나를 사용하면 다른 (또는 다음 버전)을 손상시킬 수 있습니다 ...