Java 如何拦截抽象方法
问题标题并没有完全描述问题的含义,但我不能在标题范围内完成。如果你帮我把它换成更方便的,我会很高兴的 下面介绍了一些类层次结构: 抽象父母:Java 如何拦截抽象方法,java,interceptor,cglib,Java,Interceptor,Cglib,问题标题并没有完全描述问题的含义,但我不能在标题范围内完成。如果你帮我把它换成更方便的,我会很高兴的 下面介绍了一些类层次结构: 抽象父母: public abstract class AbstractParent { public void realParentMethod() { System.out.println("invoking abstractMethod from realParentMethod"); abstractMethod();
public abstract class AbstractParent {
public void realParentMethod() {
System.out.println("invoking abstractMethod from realParentMethod");
abstractMethod();
}
public abstract void abstractMethod();
}
ChildImpl:
public class ChildImpl extends AbstractParent {
public void abstractMethod() {
System.out.println("abstractMethod implementation is running!");
}
}
我想截取此层次结构中的每个方法调用,并添加一些功能。即使方法被彼此调用,我也希望每次都能截获它们
我将cglib增强器与MethodInterceptor实现结合使用来实现:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] srgs) {
AbstractParent parentImpl = new ChildImpl();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(AbstractParent.class);
enhancer.setCallback(new LocalMethodInterceptor(parentImpl));
AbstractParent proxyImpl = (AbstractParent) enhancer.create();
// straight calling abstractMethod
proxyImpl.abstractMethod();
System.out.println("-----------------");
// calling realParentMethod will lead to abstractMethod calling
proxyImpl.realParentMethod();
}
static class LocalMethodInterceptor<T> implements MethodInterceptor {
private T origin;
public LocalMethodInterceptor(T origin) {
this.origin = origin;
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
try {
System.out.println("intercept method["+method.getName()+"] before execution!");
return method.invoke(origin, args);
} finally {
System.out.println("cleanup after method["+method.getName()+"] execution!");
}
}
}
}
这是委托方法的结果,即在另一个实例
T origin
上调用拦截的方法。Cglib创建一个代理,在该代理中它重写任何方法来实现MethodInterceptor
。因此,拦截器仅在直接调用时应用。当您传递给源
对象时,拦截器将不再有效
如果希望拦截任何方法调用,而不是委派,则需要使用cglib对象作为委派目标的替换。您可以通过MethodProxy
实例调用原始方法
intercept method[abstractMethod] before execution!
abstractMethod implementation is running!
cleanup after method[abstractMethod] execution!
-----------------
intercept method[realParentMethod] before execution!
invoking abstractMethod from realParentMethod
abstractMethod implementation is running!
cleanup after method[realParentMethod] execution!