在静态上下文中访问实现类

时间:2014-08-01 13:41:45

标签: java class inheritance static

是否可以在静态上下文中确定实现类的类。鉴于我想在超类中创建一个记录器,它在实现类的类名下记录它的消息。

目前我正在尝试使用这种方法:

public abstract class GenericDao<T, ID extends Serializable>
{
    protected static Logger logger = Logger.getLogger(new Object() { }.getClass().getEnclosingClass());

    ...
}

但我还是得到了超类。有没有办法做到这一点,或者当我有权访问“this”时,我应该放弃并在实际的日志记录方法中包含该类。

1 个答案:

答案 0 :(得分:0)

在这种情况下,静态变量和方法始终属于声明类GenericDao。如果您创建了一个新的子类SpecificDao,那么它在访问它时不会访问新的logger副本,它正在访问与GenericDao中完全相同的记录器。

您需要将Logger创建为非静态成员,并且每个对象都有一个(可能非常低效),或者在每个类中声明记录器。

如果您在getLogger()中使用抽象方法GenericDao而根本没有Logger,那么应该为您提供所需的内容是什么。

每当它想要记录GenericDao来电时getLogger().log

然后,实现类定义自己的私有静态Logger记录器。它们重写getLogger()抽象方法并从中返回静态方法。