我有一个这样实现的 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);
}
}
}
这样做的问题是它不拦截构造函数,它也会给出这种错误
无法为接口类型定义非公共或非虚拟方法“lambda$static$1”
什么是制作拦截器的最佳方法,它将代理某个域中的类中的每个方法(我希望能够获取方法名称,检查方法参数(如果有的话)并且只是转发执行)。