我正在寻找一种方法来记录方法调用,将其存储在数据库中,然后在以后执行它。
我正在考虑使用其所有参数序列化方法调用,存储它,然后将其检索回来,反序列化并执行它的方法。
所以,我正在寻找一个通用的方法,它允许我用它的参数存储方法调用。像
这样的东西public String myMethod(String arg1, String[] arg2) {
logMethodCall(thisMethodName, allMethodArgumentsSerialized)
}
并且logMethodCall
会将信息存储在数据库中。
所以
a)任何允许我动态循环方法的所有参数并将它们序列化的代码?
b)动态获取当前方法名称的任何代码?
c)完成类似事情的任何其他想法
答案 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实现)。
你可以花很多时间尝试将方形钉子楔入圆孔中,或者只是简单地做到这一点;这是你的选择。我真的不是以负面的方式表达这一点;这只是一个观察。