2017-03-27 23 views
0

私はクラスを再定義しようとしています。私はフォルダという名前のクラスを持っています。 OSGi(Felixを使用)では、同じメソッドでいくつかの追加のロギングを持つ新しいFolderクラスがあります。クラス再定義が機能しない

私は起動時にエージェントが設定されていませんフェリックスからフォルダクラスを取ると、メインクラスローダ

のメインフォルダのクラスを再定義しようとしています。

new ByteBuddy() 
         .redefine(Class.forName(classToOverride.trim()), ClassFileLocator.ForClassLoader.of(felixClassLoader)) 
         .name(classToOverride.trim()) 
         .make()       .load(contextClassLoader); 

私はロードメソッドでさまざまな方法を試しました。

私はClassReloadingStrategy.fromInstalledAgentで次のエラー

Caused by: java.lang.IllegalStateException: Cannot inject already loaded type: class com.dotmarketing.portlets.folders.model.Folder 
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.inject(ClassInjector.java:187) ~[byte-buddy-1.6.12.jar:?] 
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:187) ~[byte-buddy-1.6.12.jar:?] 
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:120) ~[byte-buddy-1.6.12.jar:?] 
at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:79) ~[byte-buddy-1.6.12.jar:?] 
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4376) ~[byte-buddy-1.6.12.jar:?] 
at com.dotmarketing.osgi.GenericBundleActivator.publishBundleServices(GenericBundleActivator.java:177) ~[dotcms_4.1.0_563a5c3.jar:?] 

を取得する任意の戦略がなければ私はエラーを取得していないが、動作しません。

答えて

1

JVMでは、既にロードされているクラスを単純に再定義することはできません。 Byte Buddyが使用できるAPIであるAgentBuilderを提供するJavaエージェントを使用して、クラスを再定義することしかできません。メソッドの内容は変更できますが、クラスのレイアウトは変更できないことに注意してください。これを行うには、Advice APIをご覧ください。

+0

AgentBuilder APIまたはAgentBuilderとAdviceの両方を使用してフィールド(クラスレイアウト)を変更することはできません。 –

+1

ツールを使用することはできません。 –

+0

私はいくつかのJava仕様が合格している場合にのみ、あなたのstackoverflowの言及を考えましたか?それはどれですか? –

関連する問題