Частные методы не отправляются практически, поэтому вы не можете изменить отправку частного метода в подкласс. Единственный способ сделать это - сделать жесткую привязку условной отправки в частный метод напрямую.
Вы можете сделать это, используя класс 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
возвращается.
Непонятно, что вы просите. Метод 'private' имеет значение только для его класса объявления, который является классом, который вы должны переопределить. Является ли этот класс суперклассом другого класса, не имеет значения. – Holger
Поскольку частный метод A в свою очередь вызывает другие защищенные пакетом и частные методы, которые я не хочу заменять или копировать, мне нужно переопределить частный метод A в B (подкласс) –
В 'B' такого метода нет. Метод 'private'' A' существует только в 'A'. Единственная возможность решить вашу задачу будет заключаться в замене '' '' 'private' методом с помощью метода, который выполняет проверку этого экземпляра B и передает его в старый код, если проверка оценивается как' false'. Я не знаю, поддерживает ли ByteBuddy этот тип Instrumentation, но он все равно выглядит сомнительным. – Holger