有没有办法序列化方法调用

时间:2013-07-12 18:52:11

标签: java serialization

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

我正在考虑使用其所有参数序列化方法调用,存储它,然后将其检索回来,反序列化并执行它的方法。

所以,我正在寻找一个通用的方法,它允许我用它的参数存储方法调用。像

这样的东西
public String myMethod(String arg1, String[] arg2) {

  logMethodCall(thisMethodName, allMethodArgumentsSerialized)

}

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

所以

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

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

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

3 个答案:

答案 0 :(得分:1)

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

  

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

答案 1 :(得分: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 ...
}

希望有所帮助。

答案 2 :(得分:0)

嗯,我敢说,处理这样的东西的自然语言是Lisp。正如他们所说,“代码=数据”。

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

你可以花很多时间尝试将方形钉子楔入圆孔中,或者只是简单地做到这一点;这是你的选择。我真的不是以负面的方式表达这一点;这只是一个观察。