之前我推倒重来 - 我希望能够插入调试的痕迹在我的代码,如say("We are here.");
,无需在每一个类中定义static void say()
。它需要做System.out.println(s)
,并且全局开启或关闭(doSay(false)
),并且我也希望它能够识别它被调用的类(as described here)。例如:编写调试一个简单的打印方法的Java
MyClass的:我们在这里。
确实的Java已经有了这样的工具吗?
之前我推倒重来 - 我希望能够插入调试的痕迹在我的代码,如say("We are here.");
,无需在每一个类中定义static void say()
。它需要做System.out.println(s)
,并且全局开启或关闭(doSay(false)
),并且我也希望它能够识别它被调用的类(as described here)。例如:编写调试一个简单的打印方法的Java
MyClass的:我们在这里。
确实的Java已经有了这样的工具吗?
我不知道静态导入!我结合从@ninetwozero,@karl和@erickson理念打造这样的:
package myPkg;
public class CLHUtilities {
private static boolean saying = false;
public static void tracing(boolean b) {
saying = b;
}
/*
* Technique taken from:
* http://stackoverflow.com/questions/282977/which-class-invoked-my-static-method
*/
public static void say(String s) {
if (saying) {
Throwable t = new Throwable();
StackTraceElement[] trace = t.getStackTrace();
String className = trace[1].getClassName();
String whoCalledMe = null;
try {
whoCalledMe = Class.forName(className).getSimpleName();
} catch (Exception e) {
}
System.out.println(whoCalledMe + ": " + s);
}
}
}
可以用来简单地为:
import static myPkg.CLHUtilities.*;
:
tracing(true);
:
say("We are here.");
这完全符合我的需要。
是的。它被称为日志框架。 Java有java.util.logging
。但许多人更喜欢使用Log4J。
你可以使用Apache的Log4J一个记录器,并完成类似logger.trace("We are here");
。如果希望关闭该功能,请在配置中将日志级别设置得更高(调试,警告,错误),并且日志将会消失。
Java具有更高级的日志工具,如log4j或logback。在那里,你应该创建一个public static final Logger logger = Logger.getLogger(..)
并使用记录器来编写debug/info/warn/error消息到你喜欢的任何地方。它们是高度可配置的 - 什么和在哪里登录。
对于更简单的情况(如果这是一个玩具项目),您可以简单地用public static void log(..)
方法定义一个类并在每个类中使用它。
为什么不在你的Main.java中静态声明一个函数,并全方位地使用它?
public class Main {
private static boolean debug;
public static void setDebug(boolean d) { Main.debug = d; }
public static void say(String s) { if(Main.debug) System.out.println(s); }
}
让我知道这是否符合您的需求。
编辑:(直接至少,不)订正代码
这实际上是我寻找的那种简单性,除非我做错了什么,静态say()不能引用'这个'。最重要的是,我希望能够从任何地方调用say(),而无需限定;例如Main.say( “东西”);在Java中可能吗? – Chap
'debug'和'setDebug'也可以做成'static'。 –
我更新了代码,以便它不再引用这个上下文(当它是静态的时候,它不是一个聪明的举动)。 – ninetwozero
使用SLF4j,不log4j的。它们都是由same author, CekiGülcü创建的,但SLF4J结合了使用log4j所获得的知识,并查看了其他日志软件包中的进展。
SLF4J是许多不同的基础日志记录系统的常用API,如log4j,java.util.logging
包等。它也有自己的“原生”实现,即logback。
我喜欢它比log4j更好的一个原因是它支持消息模板。这些keep your code simpler.
此外,它可以让我包括一个库记录,但让我的图书馆的用户选择日志实现。如果没有这样的事情,用户可能必须为我的库配置日志记录,并且它不会与其他应用程序统一。
为什么你需要重新定义每个类中的'static'函数?根据定义,'static'函数不需要实例,所以你可以从任何地方调用它们。 –
可能重复的[Java,如何跟踪函数调用](http://stackoverflow.com/questions/4677502/java-how-to-trace-functions-called) – CoolBeans
@Karl:有没有一种方法来定义它我可以在任何地方调用它,比如简单的说(...)或者log(...),而不是'MyUtils.say(...)'? – Chap