У меня есть агент Java, реализованный следующим образом:
public static void premain(String args, Instrumentation instrumentation) throws ClassNotFoundException {
new AgentBuilder.Default()
.type(isSubTypeOf(Object.class).and(nameStartsWith("com.my.domain")))
.transform(new Transformer5())
.installOn(instrumentation);
}
а затем класс преобразования:
public class Transformer5 implements AgentBuilder.Transformer {
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader) {
return builder.method(any().and(isDeclaredBy(typeDescription)))
.intercept(MethodDelegation.to(Interc4.class));
}
}
и перехватчик:
public class Interc4 {
static String indent = "";
@RuntimeType
@BindingPriority(BindingPriority.DEFAULT * 3)
public static Object intercept(@SuperCall Callable<?> zuper,
@AllArguments Object[] allArguments,
@Origin String method) throws Exception {
System.out.println(indent + "Intercepted4 M" + method);
try {
indent += " ";
return zuper.call();
} finally {
//post process
indent = indent.substring(0, indent.length()-2);
}
}
}
Проблема в том, что он не перехватывает конструкторы, а также выдает такие ошибки.
Невозможно определить закрытый или не виртуальный метод «лямбда $ static $ 1» для типа интерфейса
Каков наилучший способ сделать перехватчик, который будет проксировать каждый метод в классе из некоторого домена (я хочу иметь возможность получить имя метода, проверить аргументы метода (если есть) и просто переслать выполнение).