2017-02-17 16 views
0

Основываясь на идее Can I redefine private methods using Byte Buddy?, я хотел бы переопределить частный метод из родительского класса. Возможно ли это? Или это похоже на проблему с курицей и яйцом?Могу ли я переопределить частный метод из родительского класса с помощью Byte Buddy?

Спасибо!

+0

Непонятно, что вы просите. Метод 'private' имеет значение только для его класса объявления, который является классом, который вы должны переопределить. Является ли этот класс суперклассом другого класса, не имеет значения. – Holger

+0

Поскольку частный метод A в свою очередь вызывает другие защищенные пакетом и частные методы, которые я не хочу заменять или копировать, мне нужно переопределить частный метод A в B (подкласс) –

+0

В 'B' такого метода нет. Метод 'private'' A' существует только в 'A'. Единственная возможность решить вашу задачу будет заключаться в замене '' '' 'private' методом с помощью метода, который выполняет проверку этого экземпляра B и передает его в старый код, если проверка оценивается как' false'. Я не знаю, поддерживает ли ByteBuddy этот тип Instrumentation, но он все равно выглядит сомнительным. – Holger

ответ

0

Частные методы не отправляются практически, поэтому вы не можете изменить отправку частного метода в подкласс. Единственный способ сделать это - сделать жесткую привязку условной отправки в частный метод напрямую.

Вы можете сделать это, используя класс Byte Buddy's Advice в сочетании с Java-агентом. Агент Java будет выглядеть следующим образом:

new AgentBuilder.Default() 
    .disableClassFormatChanges() 
    .with(RedefinitionStrategy.REDEFINITION) 
    .type(is(ClassWithPrivateMethod.class)) 
    .transform((builder, type, cl, module) -> { 
    return builder.visitor(Advice.to(MyAdvice.class) 
            .on(named("privateMethod"))); 
    }).install(inst); 

где код MyAdvice является встраиваемым в befinning метода с именем privateMethod. Условная отправка будет выглядеть следующим образом:

class Adv { 
    @OnMethodEnter(skipOn = OnNonDefaultValue.class) 
    static boolean intercept(@This ClassWithPrivateMethod self) { 
    if (self instanceof ParentClass) { 
     // Your code 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 

Возвращая верно и с помощью пропускаемого coniditon, вы только выполнить фактический код, если false возвращается.

 Смежные вопросы

  • Нет связанных вопросов^_^