我有一节课,其中我看到以下内容:
this.logger.severe("");
this.logger.warning("");
this.logger.info("");
我不明白几件事:
我们如何使用之前未定义的方法?我的意思是,课堂上没有定义“记录器”方法。我认为可以定义这些方法,因为所考虑的类是另一个定义了“logger”的类的扩展。但是在类的定义中没有“扩展”语句(只有“实现”)。
我可以理解这样的事情:“objectName.methodName”。但那是什么“objectName.something1.something2”? “something1.something2”是方法的名称?方法名称可以包含点吗?
这些“记录器。*”究竟是什么?我认为他们保存了有关代码执行的信息。他们写了关于执行期间发生的事情的报告。但是我可以在哪里找到这些信息?
增加:
在文件的开头我有:import java.util.logging.Logger;
然后在课堂上我有:private Logger logger = Logger.getLogger("a.b.c.d")
;
所以,logger是Logger类的一个对象(但是我不明白为什么他们不能使用“new Logger()”以通常的方式实例化类。我也不明白logger.severe(“”)到底是做什么的
答案 0 :(得分:13)
记录器没有任何特殊之处。这只是Java代码。
public class SomeClass {
private Logger logger = LogFactory.getLogger(SomeClass.class);
public void doSomething() {
this.logger.debug("foo");
}
}
this.logger
只指向当前实例logger
的名为this
的实例变量。在此示例中,this.
前缀是超级丰富的。也可以在这里做logger.debug("foo")
。
如果它未在SomeClass
本身中声明,那么它可能已在扩展类中声明。检查在extends
中声明的类。
关于您的objectName.something1.something2
疑问,您是否已了解System.out.println()
的工作原理? System.out
会返回一个PrintStream
对象,而该对象又有一个println()
方法。因此,如果objectName.something
返回带有方法的完全Object
,那么您可以继续链接方法调用。
基本上,
objectName.something1.something2;
可翻译为
SomeObject someObject = objectName.something1;
someObject.something2;
但如果您在代码中的任何其他地方不需要someObject
,那么可以像在您的示例中那样缩短它。
更新:根据您的更新:
因此,logger是Logger类的一个对象(但是我不明白为什么他们不能使用“new Logger()”以通常的方式实例化类。我也不明白究竟是什么logger.severe(“ “)做。
Just read the javadoc of the class in question what it all does。至于为什么它不能被实例化,这是因为factory pattern。
更新2 :根据另一个混淆:
我不明白为什么他们使用“这个”。我的意思是,如果我只使用字段名称,默认情况下它不会是该对象的字段吗?我在“this.x”和“x”之间有什么区别吗?
通过这种方式,您可以更明确地了解您要访问的是哪一个。如果该方法包含例如名称为logger
的参数或局部变量,则this.logger
仍会引用实例变量。
public class SomeClass {
private Logger logger = LogFactory.getLogger(SomeClass.class);
public void doSomething(Logger logger) {
this.logger.debug("foo"); // Refers to the instance variable.
logger.debug("foo"); // Refers to the method argument.
}
public void doSomethingElse() {
Logger logger = LogFactory.getLogger(SomeClass.class);
this.logger.debug("foo"); // Refers to the instance variable.
logger.debug("foo"); // Refers to the method local variable.
}
}
答案 1 :(得分:3)
'logger'将是另一个对象,而不是方法。此记录器类将在其上定义方法,如public void severe(String message)
'something1'将是'objectName'包含的对象。例如,Car.Engine.Cylinder.Fire()
,使用一种方法来触发像这样的汽车柱面被认为是不好的做法,你应该做更像Car.StartEngine()
的事情(更多信息见the law of demeter)
记录器会记录您程序中发生的事情,因此如果出现崩溃或错误,您可以看到发生了什么。无论是将其记录到文本文件还是记录到某个数据库,都将记录到记录器的实现中。
答案 2 :(得分:3)
修改:更改了log4j链接。
答案 3 :(得分:1)
logger不是一个方法,而是一个类变量,它似乎是一个暴露方法“严重”,“警告”和“信息”的对象。
检查你的课程,例如“someClass logger = new someClass();”
答案 4 :(得分:1)
java.util.Logger类是Java日志API的主要访问点。以下是创建记录器的方法:
Logger logger = Logger.getLogger("myLogger");
作为参数传递给getLogger()工厂方法的字符串是要创建的Logger的名称。您可以自由选择名称,但名称表示Logger在Logger层次结构中的位置。每一个。名称中的(点)被解释为层次结构中的分支。