所以我试图重新定义一个班级。我有一个名为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我没有错误但是没有工作。
答案 0 :(得分:1)
在JVM上,您不能简单地重新定义已加载的类。您只能使用Java代理重新定义类,其中Byte Buddy提供您可以使用的AgentBuilder
API。请注意,只能更改方法的内容,而不能更改类的布局。您可能希望查看Advice
API来执行此操作。