问题描述
请javaeye的同仁帮我解释一下:private Logger log=Logger.getLogger(this.getClass());这句代码有什么作用。我不懂,this.getClass()得到什么?Logger.getLogger(this.getClass())又得到什么,这样写,有什么好处?
解决方案
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对象的引用了,见下列代码: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 stubThisKeywordsB b = new ThisKeywordsB();}} 运行结果:ThisKeywordsA className == class com.zhaipuhong.j2se.keywords.ThisKeywordsBThisKeywordsB className == class com.zhaipuhong.j2se.keywords.ThisKeywordsB由于B继承A,A对象首先被创建(请不要考虑抽象类和接口^_^)然后作为B对象的字对象创建B 对象. 此时的Logger就是B对象的一部分,可以为B对象所用。
解决方案二:
1.this.getClass()得到的是一个Class类型的对象,这个getClass方法是Objct里的方法,是所有类都有的2.Logger.getLogger(B.class);得到的是一个用当前类实例化的Logger对象,用来在输出日志的时候打印出当前的类名
解决方案三:
第一块代码应该是:class A{private Logger log=Logger.getLogger(A.class); }class B extends A{private Logger log=Logger.getLogger(B.class); }B中应该是Logger.getLogger(B.class), 前面的写错了
解决方案四:
1, 应该是受保护的吧:protected Logger log = Logger.getLogger(this.getClass())2,这种写法一般是用来给有继承关系的类使用的, 一般写法如下:class A{private Logger log=Logger.getLogger(A.class); }class B extends A{private Logger log=Logger.getLogger(A.class); }而用楼主提到的写法:class A{protected Logger log=Logger.getLogger(this.getClass());}class B extends A{}则可以共用log, 这里的this.getClass()就拿当前类型的运行时类,因为B继承A, 所以B中的this.getClass()就相当于B.class , 而A中的就相当于A.class