Logger的问题?

[size=large]
请javaeye的同仁帮我解释一下:
private Logger log=Logger.getLogger(this.getClass());
这句代码有什么作用。
我不懂,this.getClass()得到什么?
Logger.getLogger(this.getClass())又得到什么,这样写,有什么好处?[/size]

this.getClass()得到什么?

this 表示当前对象的引用;
getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类;
this.getClass() 就是返回当前对象的运行时类。

Logger.getLogger(this.getClass())又得到什么?
他得到一个Logger对象,这个Logger将监视this.getClass()这个运行时类,这个运行时类里面你可能创建了log.info(""), log.debug(""),……等语句,那么这些语句就会根据你预先定义的Logger级别来输出你的日志。就跟你写System.out.print("")一样,不同的是Logger可以根据需要按级别进行日志输出控制。(当然这只是一方面)

Logger.getLogger(this.getClass())这样写,有什么好处?
这样一来你只需要在基类中写一行代码就可以了,子类可以直接使用,这也是复用的原则。
如果你有一个类A,你可以在A类的开始这么写
Logger log=Logger.getLogger(A.class)
这就定死了这个Logger只监视A类本身如果B类继承A类,你创建B类对象时,上面创建的log对象对B是不起作用的。这就就是hard code.

而Logger.getLogger(this.getClass())就不同,你创建B对象时,this就是B对象的引用了,见下列代码:
[code="java"]
package com.zhaipuhong.j2se.keywords;

public class ThisKeywordsA {
protected String className = this.getClass().toString();

public ThisKeywordsA(){
    System.out.println("ThisKeywordsA className == " + className);
}

}

package com.zhaipuhong.j2se.keywords;

public class ThisKeywordsB extends ThisKeywordsA{

public ThisKeywordsB(){
    System.out.println("ThisKeywordsB className == " + className);
}
/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    ThisKeywordsB b = new ThisKeywordsB();
}

}
[/code]
运行结果:
ThisKeywordsA className == class com.zhaipuhong.j2se.keywords.ThisKeywordsB
ThisKeywordsB className == class com.zhaipuhong.j2se.keywords.ThisKeywordsB

由于B继承A,A对象首先被创建(请不要考虑抽象类和接口^_^)然后作为B对象的字对象创建B 对象. 此时的Logger就是B对象的一部分,可以为B对象所用。

1, 应该是受保护的吧:protected Logger log = Logger.getLogger(this.getClass())

2,这种写法一般是用来给有继承关系的类使用的, 一般写法如下:
[code="java"]class A{
private Logger log=Logger.getLogger(A.class);
}

class B extends A{
private Logger log=Logger.getLogger(A.class);
}[/code]
而用楼主提到的写法:
[code="java"]class A{
protected Logger log=Logger.getLogger(this.getClass());
}

class B extends A{

}[/code]
则可以共用log, 这里的this.getClass()就拿当前类型的运行时类,因为B继承A, 所以B中的this.getClass()就相当于B.class , 而A中的就相当于A.class

第一块代码应该是:
[code="java"]
class A{
private Logger log=Logger.getLogger(A.class);
}

class B extends A{
private Logger log=Logger.getLogger(B.class);
}[/code]
B中应该是Logger.getLogger(B.class), 前面的写错了

1.this.getClass()得到的是一个Class类型的对象,这个getClass方法是Objct里的方法,是所有类都有的
2.Logger.getLogger(B.class);得到的是一个用当前类实例化的Logger对象,用来在输出日志的时候打印出当前的类名