Я реализую агент, который заставляет загруженный класс неявно реализовывать интерфейс.Метод в интерфейсе, реализованный агентом, вызывает оригинальные методы класса, помеченные специальной аннотацией.Но оказывается, что в AgentBuilder.Transformer
загруженный класс все еще не существует.Однако код внутри перехватчика выполняется после фактической загрузки класса.Таким образом, код внутри перехватчика может работать с методами класса.Могу ли я вызывать эти методы, используя MethodDescription
объекты?
public class CustomTransformer implements AgentBuilder.Transformer {
public static class InstantiateInterceptor {
private final Collection<MethodDescription> methodDescription;
InstantiateInterceptor(Collection<MethodDescription> methodDescription) {
this.methodDescription = methodDescription;
}
public Object intercept(@This Object self) {
//
// Call method by descriptions somewhere here
//
return null;
}
}
@Override
public DynamicType.Builder<?> transform(
DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule module) {
try {
List<MethodDescription> cacheableMethods =
typeDescription.getDeclaredMethods().stream()
.filter(t -> t.getDeclaredAnnotations()
.isAnnotationPresent(EnhanceMarker.class))
.collect(Collectors.toList());
return builder
.implement(HasField.class)
.define(HasField.class.getMethod("value"))
.intercept(MethodDelegation
.to(new InstantiateInterceptor(cacheableMethods)));
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
}
return builder;
}
}
Я мог бы, вероятно, получить метод из @This
объекта по его имени.Но для этого требуется список типов параметров, и я могу получить только список ParameterDescription
объектов класса, и он не возвращает типы аргументов.