1

我正在寻找一种方法来记录方法调用,将其存储在数据库中,然后在稍后执行它。

我正在考虑用它的所有参数序列化方法调用,存储它,然后检索它,反序列化它并以某种方式执行它。

所以,我正在寻找一种通用方法,它允许我存储方法调用及其参数。就像是

public String myMethod(String arg1, String[] arg2) {

  logMethodCall(thisMethodName, allMethodArgumentsSerialized)

}

并将logMethodCall信息存储在数据库中。

所以

a)任何允许我动态循环方法的所有参数并序列化它们的代码?

b)动态获取当前方法名称的任何代码?

c)完成类似事情的任何其他想法

4

3 回答 3

1

这听起来像Command模式,其中实际的命令对象将在执行之前被持久化(可能是序列化):

命令模式是一种行为设计模式,其中对象用于表示和封装以后调用方法所需的所有信息。此信息包括方法名称、拥有该方法的对象和方法参数的值

于 2013-07-12T19:21:59.493 回答
1

好吧,我敢说,处理这类事情的自然语言是 Lisp。正如他们所说,“代码 = 数据”。

如果有使用 Java 的要求(例如,如果这只是已经使用 Java 的较大系统的一小部分),请考虑使用 ABCL(针对 JVM 的 Lisp 实现)。

您可能会花很多时间尝试将方形钉楔入圆孔,或者只是简单的方法;这是你的选择。我真的不是消极的意思。这只是一个观察。

于 2013-07-12T19:22:13.743 回答
0

我以前从未见过这种模式,您可以将方法调用保存到数据库。我见过延迟的方法调用和受限制的方法调用,但它们总是在运行的应用程序中,它们不会持久存在。

如果您希望拥有可以在将来执行的持久性操作,我认为正确的方法是创建某种操作或编辑对象,就像 javax.swing.undo.AbstractUndoableEdit 的工作方式一样。然后你可以从任何地方记录这些,并从任何地方执行它们。这些操作可以通过几种方式起作用,包括:

  • 存储对象类型、方法名称和泛型参数,并在以后执行这些
  • 提供特定的参数并调用预定的方法名

我会使用第二个基类,就像 Swing 所做的那样,所以从你的例子中你会有一个myMethodAction类,它的对象将参数作为属性,并且知道什么时候被告知execute它应该调用myMethod.

我也不会让myMethod实现同时做这两件事。以后会很头疼的。而是有类似的东西

public void myMethod()
{
    if(condition) ... save it ...
    else myMethodNow();
}

public void myMethodNow()
{
   ... do the work now ...
}

希望有帮助。

于 2013-07-12T19:18:18.903 回答