Исправлена ​​проблема загрузки классов с помощью ByteBuddy и Vaadin в настройке OSGi - PullRequest
2 голосов
/ 09 февраля 2020

У меня проблемы с потоком Vaadin в настройке OSGi, и, похоже, это связано с тем, как некоторые классы загружаются во внутренние компоненты при использовании шаблонов Polymer. Вот моя проблема с некоторыми деталями https://github.com/vaadin/flow/issues/7377.

В TemplateModelProxyHandler:229ff следующий код используется для загрузки прокси-класса

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();

Здесь два класса Грузчики важны. Во-первых, загрузчик классов OSGi (classLoader) здесь. Во-вторых, загрузчик классов пакета, который содержит класс TemplateModelProxyHandler, например TemplateModelProxyHandler.class.getClassLoader(). Есть ли способ использовать оба загрузчика классов здесь? Есть ли простой способ добиться этого с помощью ByteBuddy?

1 Ответ

3 голосов
/ 10 февраля 2020

Посмотрите на MultipleParentClassLoader, который поставляется с Byte Buddy. Он позволяет вам указать нескольких родителей для загрузчика классов и определить класс в нем.

...