Class Redefine无法正常工作

时间:2017-03-27 17:34:45

标签: byte-buddy

所以我试图重新定义一个班级。我有一个名为folder的类。在OSGi中(使用Felix)我有一个新的Folder类,它具有相同的方法,但有一些额外的日志记录。

我正在尝试从Felix获取文件夹类并重新定义主类加载器上的主要Folder类

我确实在启动时设置了代理。

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

我在load方法中尝试了不同的策略。

没有任何策略我会收到以下错误

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 个答案:

答案 0 :(得分:1)

在JVM上,您不能简单地重新定义已加载的类。您只能使用Java代理重新定义类,其中Byte Buddy提供您可以使用的AgentBuilder API。请注意,只能更改方法的内容,而不能更改类的布局。您可能希望查看Advice API来执行此操作。