Java中的捕获方法调用

Java中的捕获方法调用,java,methods,Java,Methods,我需要用Java捕获一个方法调用,我不想使用JPDA或JDI;我希望它发生在原始JVM中 例如: public class A { public void m() {} } public class Main { public static void main(String[] args) { A a = new A(); a.m(); } } 我不想实际让该方法在当时执行,但需要捕获它并将其安排在队列中。因此,AOP在这方面不会帮助我。我考虑了代理这个方法。例如

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

例如:

public class A {
  public void m() {}
}

public class Main {
  public static void main(String[] args) {
    A a = new A();
    a.m();
  }
}
我不想实际让该方法在当时执行,但需要捕获它并将其安排在队列中。因此,AOP在这方面不会帮助我。我考虑了代理这个方法。例如:

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

有什么想法吗?提前非常感谢。

您可以在Java中使用一种称为动态代理的技术。以下文件详细描述了这些问题:

然后,您的问题的解决方案将是(只需稍作改动):

然后为a接口的实现构造一个排队代理,并调用m方法:

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

看起来您也会很高兴看到一个s队列。

但是,从概念上讲,代理是AOP的一个实现,这一事实可能会削弱这个出色的答复。帮助我创建了用于调试的包装器。感谢这实际上是一个棘手的问题,因为我不确定是否要在多核平台上的不同内核上同时运行方法调用。谢谢。好吧,它与并发无关,它只是包装了计算——只是它被称为“run()”而不是“invoke()”;)撇开玩笑不谈,您可以稍后自己在callable上调用run()。
A a = (A) EnqueueProxy.newInstance(new AImpl());
a.m();