Вкратце: 1. У меня есть конечный класс, который я хочу создать для него динамический прокси. Как мне это сделать? 2. Могу ли я преобразовать MethodHandle в метод?Как создать динамический прокси для окончательного класса?
Прежде всего, существует ли какой-либо API для преобразования метода MethodHandle в метод? Нечто подобное в java.lang.invoke.MethodHandles
public MethodHandle unreflect(Method m) throws IllegalAccessException;
но противоположным образом arrond?
Позвольте сказать, что я хочу создать динамический java.lang.reflect.Method. Он defiend в
public final
class Method extends AccessibleObject implements GenericDeclaration,
Member ;
Так что, если я хочу использовать JDK динамического прокси я должен использовать некоторый интерфейс (член, например). Там, однако, есть 2 основных перетягивания. Во-первых, способ, такой как
public Class<?>[] getParameterTypes();
и такие, как
public Class<?> getReturnType();
не являются частью любого интерфейса, в то время как они широко используются.
Второй недостаток заключается в том, что он не может обеспечить замену. То есть я не могу передать свой динамический прокси код, ожидающий java.lang.reflect.Method.
Другой подход - использовать CGLIB или Javaassist. AFAIK, CGLIB не может проксировать последний класс, не так ли? Может ли выпускной класс прокси-сервера Javaassist? Как я могу «удалить» окончательный идентификатор из класса? AFAIL, Javvassist как-то может это сделать ...
Не могли бы вы рассказать подробнее о последнем варианте? – piotrek
Вы можете переопределить классы с помощью API-интерфейса инструментария. Скажем, класс определяет метод foo. Вы можете переименовать панель методов и вызвать ее из вашего нового метода foo, который вы переопределили –