2017-11-11 26 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

@ジムガリソン、次回はどうなるか – M0ns1f

答えて

1

実際には、例外にはすでにすべての関連情報が含まれています。例外の型名java.lang.UnsupportedOperationExceptionに「サポートされていない操作」というメッセージが含まれており、メッセージに「はスキーマ(フィールドの追加と削除)を変更しようとしました」というサポートされていない操作の名前が付けられています。

つまり、クラスの再定義中にフィールドを追加または削除することは、コアクラスやその他のクラスで試行された場合でも、HotSpot JVMではサポートされません。 the documentation状態:

再定義によって、メソッド本体、定数プールおよび属性が変更される場合があります。再定義では、フィールドやメソッドの追加、削除、名前の変更、メソッドのシグネチャの変更、継承の変更を行わないでください。これらの制限は、将来のバージョンで解除される可能性があります。他のクラスの

、ロード時間の計測はつまり、でも、エージェントがロードされる前に存在する必要があり、java.lang.Stringなどの重要なクラスのために、しかし、ランタイムでの最初の定義の前に宣言されたフィールドを変更し、助けるかもしれませんオプションではありません。

Stringクラスを変更する唯一の方法は、JVMの起動時にブートストラップクラスのパスに代替の実装を追加することですが、このような方法で構成を変更することを強くお勧めします。このような基本的なクラスで遊んでいるときにJVM全体を簡単に破壊することができます。それでも、1つのJVM(バージョン)でうまくいくと、もう1つ(または次のバージョン)が破損する可能性があります...

関連する問題