【问题标题】:Is there a better way to get the current class variable in java?有没有更好的方法来获取java中的当前类变量?
【发布时间】:2010-01-27 23:33:25
【问题描述】:

现在我正在做这样的事情:

 private static Logger logger = LoggerFactory
            .getLogger(MasterController.class);

有没有比使用类名(即 MasterController)更好的方法?也许是通用的?

【问题讨论】:

    标签: java class


    【解决方案1】:

    这个怎么样:

    private final Logger logger = LoggerFactory.getLogger(getClass());
    

    这种方法避免了复制+粘贴错误。

    我读过(不记得几年前在哪里了)Logger 实例非常便宜,而且你的类的每个实例是否都有自己的记录器也没关系。

    但是,如果您没有被说服,并且您希望 Logger 实例保持静态,那么它可能应该是 final 和大写,如下所示:

    private static final Logger LOG = LoggerFactory.getLogger(MasterController.class);
    

    【讨论】:

    • 感谢您的回答。你能解释一下为什么它也应该是最终的吗?
    • 您是否打算在某个时候将 logger 变量指向不同的 Logger 对象?如果不是,我认为'final'更惯用。它还可能允许某些编译器在某些平台上进行优化。
    • “Logger 实例非常便宜” - 我敢打赌,每个类仍然只有一个真正的 Logger instance(由 LoggerFactory 第一次调用它时创建每个类,并在以后使用同一类的调用中重用)。您实际上只是在使用它的类的每个实例中添加Logger reference 而不是单个静态引用。因此,您正在增加每个实例的大小(非常轻微),但不使用任何额外的内存来创建 Logger 实例。
    • @Nate:你完全正确。 (我不得不深入研究 log4j 以了解一些关于它的 LoggerHierarchy 来管理不同虚拟服务器的单独的东西。)
    • 是的,如果没有final 某些代码,某些地方可能会重置记录器,甚至将其设置为null,然后所有记录器调用都会失败。这是 final 的一个非常有用的方面 - 防止简单的编程错误。
    【解决方案2】:

    以下链接有一个有趣的方法:

    http://www.rgagnon.com/javadetails/java-0402.html

    为了方便,贴在这里:

    public class ClassFromStatic {
    
      public static void main(java.lang.String[] args) {
        someStaticMethod();
      }
    
      public static void someStaticMethod() {
        System.out.println
           ("I'm in " + new CurrentClassGetter().getClassName() + " class");
      }
    
      public static class CurrentClassGetter extends SecurityManager {
        public String getClassName() {
          return getClassContext()[1].getName();
        }
      }
    }
    

    【讨论】:

    • 就个人而言,我认为对于实用程序类,我更愿意将其视为您最初编写它的方式。
    【解决方案3】:

    不确定您需要什么,但您可以随时致电getClass() on an Object

    【讨论】:

    • 由于记录器是静态的,我不能在静态上下文中使用“this”..我尝试使用“this.getClass()”而不是“MasterController.class”
    • @Tim:好的,不清楚您是否需要在静态上下文中执行它只是因为记录器本身被声明为静态。
    • 嘿,匿名投票不太公平,是吗?你至少可以花 10 秒时间来激励它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2011-08-02
    • 1970-01-01
    • 2014-05-14
    • 2010-11-11
    • 2017-06-01
    相关资源
    最近更新 更多