2017-03-27 2 views
0

SO versuche ich eine Klasse neu zu definieren. Ich habe eine Klasse namens Ordner. In OSGi (mit Felix) habe ich eine neue Ordner-Klasse mit den gleichen Methoden, aber einige zusätzliche Protokollierung.Klasse Redefinieren funktioniert nicht

Ich versuche, die Ordner-Klasse von Felix zu nehmen und den Hauptordner Klasse auf dem Hauptclassloader

I den Agenten beim Start gesetzt tue neu definieren.

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

Ich habe verschiedene Strategien in der Lastmethode ausprobiert.

Ohne Strategien bekomme ich folgende Fehler

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:?] 

Mit ClassReloadingStrategy.fromInstalledAgent ich keinen Fehler bekommen, aber nicht funktioniert.

Antwort

1

Auf einer JVM können Sie eine bereits geladene Klasse nicht einfach neu definieren. Sie können eine Klasse nur mithilfe eines Java-Agenten neu definieren, wobei Byte Buddy die AgentBuilder-API bereitstellt, die Sie verwenden können. Beachten Sie, dass nur der Inhalt von Methoden geändert werden kann, nicht jedoch das Layout einer Klasse. Wahrscheinlich möchten Sie sich dazu die API Advice ansehen.

+0

Bedeutet, dass es nicht möglich ist, die Felder (Klassenlayout) mit AgentBuilder API oder AgentBuilder und Advice zu ändern, oder? –

+1

Es ist nicht möglich, ein Werkzeug zu verwenden. –

+0

Ich dachte, Ihr Stackoverflow würde erwähnt, wenn nur etwas Java Spec passiert? Welcher ist es? –

Verwandte Themen