Если ваша переменная поля - Handler
, вы не можете вызвать handle2()
, так как обработчик не знает о методе handle2()
.
Чтобы вызвать метод handle2()
(для допустимый класс), вам нужно преобразовать handler
в ConcreteHandler
- процесс, известный как «понижающее преобразование», когда вы приводите экземпляр к объекту, находящемуся ниже в иерархии объектов. Это работает только тогда, когда экземпляр handler
на самом деле является ConcreteHandler
, а не каким-либо другим производным от Handler
.
, пример:
if (handler instanceof ConcreteHandler) {
ConcreteHandler concreteHandler = (ConcreteHandler) handler;
concreteHandler.handle2();
}
EDIT: одноразовое перенаправление Я получил работу. Я не совсем уверен, как вы можете заставить его работать как постоянное перенаправление из документации, но, похоже, переопределение сработает, если вы хотите перенаправить метод навсегда. Также было внесено изменение в исходный код, необходимый для создания классов ConcreteHandler, Handler, et c, publi c.
new ByteBuddy()
.subclass(ConcreteHandler.class)
.method(named("handle")).intercept(MethodDelegation.to(ConcreteHandler.class))
.make()
.load(getClass().getClassLoader())
.getLoaded()
.newInstance()
.handle2();