Мы используем bytebuddy для замены различных аннотированных методов, например. как это:
public class Example{
@Setting
public String foo(){
return "hello";
}
@Setting
public String bar(){
return "world";
}
}
На данный момент мы используем MethodDelegation:
new ByteBuddy().subclass(Example.class)
.method(ElementMatchers.isAnnotatedWith(Setting.class)
.intercept(MethodDelegation.to(interceptors)).make().load(...)
и interceptors
имеет следующее:
public String interceptString(@Origin Method method) {
// fetch current value from DB
return db.fetchString(method);
}
Как видите, нам нужна некоторая информация из исходного метода, чтобы получить правильные данные из базы данных. Это работает, но:
Нам нужно значение из базы данных только один раз (при запуске приложения). После этого значение на самом деле не является динамическим. Из-за соображений производительности мы хотим изменить MethodDelegation на FixedValue, чтобы был только один вызов БД для каждого метода/настройки, и все последующие вызовы будут использовать «кэшированное» фиксированное значение.
Обычно мы использовали бы что-то вроде
//...
.method(ElementMatchers.isAnnotatedWith(Setting.class)
.intercept(FixedValue.value(getValue()))
а также
private Object getValue(){
Method method = ???
return db.fetchString(method);
}
Поскольку нам нужен метод для разрешения и извлечения данных из БД, он отсутствует. Итак, наконец, вопрос:
Есть ли возможность передать перехваченному методу фиксированное значение или что здесь может быть лучше?