2017-03-27 61 views
0

所以我正在嘗試重新定義一個類。我有一個名爲文件夾的類。在OSGi(使用Felix)我有一個新的文件夾類與相同的方法,但一些額外的日誌記錄。類重新定義不工作

我試圖從菲利克斯文件夾類並重新定義主類加載器

我有代理在啓動時設置主文件夾類。

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

我試圖在負載方法不同的策略。

沒有任何策略,我得到以下錯誤

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

隨着ClassReloadingStrategy.fromInstalledAgent我沒有得到任何錯誤,但不起作用。

回答

1

在JVM上,您不能簡單地重新定義已經加載的類。您只能使用Java代理重新定義一個類,其中Byte Buddy提供您可以使用的AgentBuilder API。請注意,只能更改方法的內容,而不能更改課程的佈局。你可能想看看Advice API。

+0

表示使用AgentBuilder API或AgentBuilder和Advice都無法更改字段(類佈局),對吧? –

+1

這是不可能使用任何工具。 –

+0

我以爲你的stackoverflow的提到,如果只有一些Java Spec傳遞?它是哪一個? –