方便调用方法调用?

时间:2014-03-13 15:19:06

标签: java

正在寻找一种方法来自动化我经常执行的艰巨机械程序:在方法上实施跟踪记录

考虑以下虚构方法。

private void createBaz(String key, String databaseConfigKey, String query) {
    this.queries.put(key, query);
    this.databases.put(key, Database.forKey(databaseConfigKey));
}

private void createFrob(String key, String hostname) {
    this.frobs.put(key, query);
}

现在,我将添加一些有用的日志记录。

private void createBaz(String key, String databaseConfigKey, String query) {
    this.log.trace("createBaz(" + key + ", " + databaseConfigKey + ", " + query + ")");
    this.queries.put(key, query);
    this.databases.put(key, Database.forKey(databaseConfigKey));
}

private void createFrob(String key, String hostname) {
    this.log.trace("createFrob(" + key + ", " + hostname + ")");
    this.frobs.put(key, query);
}

请注意两个log.trace调用的相似之处。

我输入了很多这样的日志行,我已经厌倦了。我正在寻找这样的东西:

private void createBaz(String key, String databaseConfigKey, String query) {
    doLogTrace();
    this.queries.put(key, query);
    this.databases.put(key, Database.forKey(databaseConfigKey));
}

private void createFrob(String key, String hostname) {
    doLogTrace();
    this.frobs.put(key, query);
}

我可能需要帮助改进我的问题!

如果doLogTrace();恰好是doLogTrace(this,System.foo(),#$^#$&^$#);之类的较长字符串,对我来说无关紧要。它甚至可以是多行,只要它是我使用它的SAME字符串。然后我可以把那个字符串放在键盘宏中。

我考虑过的事情

  • AspectJ 不适用于此项目。
  • IDE魔术。我可以为emacs写一个宏,可以跳到方法的顶部,复制名称和参数列表,放下一行,粘贴它并自动编辑成log.trace("<methodName>(" + <method1> + ["," + <methodN>] +")"); ......但是,通常是我的。 java文件只在Eclipse中打开...:/

3 个答案:

答案 0 :(得分:0)

听起来你想要Aspect-Oriented Programming

这是一个很好的overview of doing AOP with Guice

答案 1 :(得分:0)

在这篇文章中,您可以看到如何获取当前正在执行的方法的名称。 Getting the name of the current executing method

有了这个,你也得到了你的每个方法参数,所以创建一个新的方法来接受其余的参数(int ...将允许你输入任意数量的int,你可以使用Object)

例如:

private void logTrace(Object ... args) {
    String methodName = stacktrace.methodName;
    String logmsg = methodName + "(";
    foreach(arg : args){
        logmsg+= arg + ", ";
    }
    logmsg+= ")";
    log(logmsg);
}

答案 2 :(得分:0)

您可以使用Java Proxy class为每个方法添加一些前/后代码。好处是您可以避免修改原始代码。

如果您正在寻找更快速和肮脏的解决方案,您可以使用Thread.currentThread()。getStackTrace()并只显示一个相关的框架(它不会获得参数值)