Я смотрю код ByteBuddy от кого-то другого. Он использует ByteBuddy для создания подклассов времени выполнения, которые используются как прокси-серверы для реализации некоторого кода управления его средой выполнения в конкретных объектах.ByteBuddy: Использовать новое определенное поле в перехвате во время построения класса
Class<? extends T> newSubClass = new ByteBuddy(ClassFileVersion.ofThisVm())
.subclass(classType)
.defineField("_core", Object.class, Visibility.PUBLIC) //<---
.method(ElementMatchers.isDeclaredBy(classType))
.intercept(InvocationHandlerAdapter.of((proxy, method, m_args) -> {
//TODO: Need to replace core with _core as core is a function argument and will make it bound
return proxyHandler(core, method, m_args); //<--
}))
.make()
.load(roleType.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
T proxy = ReflectionHelper.newInstance(newSubClass, args);
newSubClass.getField("_core").set(proxy, core);
Для того, чтобы не связывать core
объект непосредственно в лямбда Я хочу использовать новый Defined поле _core
таким образом я могу повторно использовать сгенерированный класс (а не регенерировать его для каждого вызова функции). Есть ли способ достичь этого?
Заранее спасибо.
Спасибо за подсказку w.r.t. кэширование. Я бы использовал 'WeakHashMap, класс >>' else. –
lschuetze
Это не работает, поскольку значение является подклассом ключа и сильно ссылается на него. Скорее используйте 'TypeCache', который работает вокруг этого, также ссылаясь на значение мягко или слабо. –
Мне все еще не ясно, как я могу получить доступ к новому аргументу '_core' в' .intercept (InvocationHandlerAdapter.of ((proxy, method, m_args) -> proxyHandler (core, method, m_args); ' – lschuetze