Method.invoke java上的监听器

时间:2014-12-01 16:53:59

标签: java reflection listener

嗨,大家。
我想通过调用如下方式在调用的方法上添加一个监听器:

myClass.myMethod(...);

在运行时,它将类似于:

listenerClass.beforeMethod(...);
myClass.myMethod(...); 
listenerClass.beforeMethod(...);

我想覆盖Method.invoke(...)

public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    doBefore(...);
    super.invoke(...);
    doAfter(...);
}

Class.java和Method.java是final,我尝试使用自己的ClassLoader。 也许工厂或注释可以完成这项工作。 谢谢你的回答。

1 个答案:

答案 0 :(得分:8)

一种选择是使用面向方面的编程模式。

在这种情况下,您可以使用代理(JDK或CGLIB)。

以下是JDK代理的示例。你需要一个界面

interface MyInterface {
    public void myMethod();
}

class MyClass implements MyInterface {
    public void myMethod() {
        System.out.println("myMethod");
    }
}

...

public static void main(String[] args) throws Exception {
    MyClass myClass = new MyClass();
    MyInterface instance = (MyInterface) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
            new Class<?>[] { MyInterface.class }, new InvocationHandler() {
                MyClass target = myClass;

                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if (method.getName().equals("myMethod")) { // or some other logic 
                        System.out.println("before");
                        Object returnValue = method.invoke(target, args);
                        System.out.println("after");
                        return returnValue;
                    }
                    return method.invoke(target);
                }
            });
    instance.myMethod();
}

打印

before
myMethod
after

显然,有些图书馆比上述图书馆做得更好。看看Spring AOP和AspectJ。