修复 OSGi 设置中 ByteBuddy 和 Vaadin 的类加载问题

Fix classloading issue with ByteBuddy and Vaadin in OSGi setup

我在 OSGi 设置中遇到 Vaadin 流程的问题,这似乎与使用 Polymer 模板时某些 classes 在内部加载的方式有关。 这是我的一些细节问题 https://github.com/vaadin/flow/issues/7377.

TemplateModelProxyHandler:229ff中使用以下代码加载代理Class

Class<?> proxyType = proxyBuilder

// Handle bean methods (and abstract methods for error handling)
.method(method -> isAccessor(method) || method.isAbstract())
.intercept(MethodDelegation.to(proxyHandler))

// Handle internal $stateNode methods
.defineField("$stateNode", StateNode.class)
.method(method -> "$stateNode".equals(method.getName()))
.intercept(FieldAccessor.ofField("$stateNode"))

// Handle internal $modelType methods
.defineField("$modelType", BeanModelType.class)
.method(method -> "$modelType".equals(method.getName()))
.intercept(FieldAccessor.ofField("$modelType"))

// Create the class
.name(proxyClassName).make()
.load(classLoader, ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();

这里,两个 Class 装载机很重要。首先,这里是 OSGi Bundle ClassLoader (classLoader)。其次,包含 class TemplateModelProxyHandler 的 Bundle 的 classloader,例如TemplateModelProxyHandler.class.getClassLoader()。 有没有办法在这里同时使用两个 classloader? ByteBuddy 有没有简单的方法来实现?

查看 Byte Buddy 附带的 MultipleParentClassLoader。它允许您为一个 class 加载程序指定多个父级并在其中定义一个 class。