用Java捕获方法调用

我需要捕获Java中的方法调用,我不想使用JPDA或JDI; 我希望它发生在原始的JVM中。

例如:

public class A { public void m() {} } public class Main { public static void main(String[] args) { A a = new A(); am(); } } 

我不想让方法在当时执行,但需要捕获它并将其安排在队列中。 因此,AOP在这方面不会帮助我。 我想过代理方法。 像这样的东西:

 public class A { public void m() { methodQueue.add(new MethodInvocation() { public void invoke() {m_orig();} }); } private void m_orig(){} } 

有任何想法吗? 非常感谢提前。

您可以在Java中使用名为Dynamic Proxies的技术。 它们在以下文档中详细描述: 动态代理

那么问题的解决方案就是(只需要很少的改动):

 public interface A { void m(); } public class AImpl implements A { public void m() {} } public class EnqueueProxy implements java.lang.reflect.InvocationHandler { private Object obj; public static Object newInstance(Object obj) { return java.lang.reflect.Proxy.newProxyInstance( obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new EnqueueProxy(obj)); } private EnqueueProxy(Object obj) { this.obj = obj; } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { try { MethodQueue mq = ... // get the queue from where you want mq.add(new MethodInvocation(obj, m, args) } catch (InvocationTargetException e) { throw e.getTargetException(); } catch (Exception e) { throw new RuntimeException("unexpected invocation exception: " + e.getMessage()); } return null; } } 

然后构造一个EnqueueProxy用于A接口的实现并调用m方法:

 A a = (A) EnqueueProxy.newInstance(new AImpl()); am(); 

看起来你也会对Callable的队列感到满意。