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!