是否可以从匿名内部类的实例确定外部类的类名

时间:2018-01-15 21:00:27

标签: java reflection slf4j

我有一个非常典型的日志记录情况,我只想提供一个匿名内部类的实例,我想代表外部类编写一条日志消息。我正在使用slf4j。

让我说我有一个班级:

public abstract class AFoo implements IFoo

然后我有一个外部类,它有一个带有抽象内部 IFoo 类的字段:

public class Outer {
    protected IFoo myFoo = new AFoo() { }
} 

第三,我有一些实用程序类来生成一些日志消息:

public SomeFooLoggerUtil {
    public static writeLogMessagesForFoo(IFoo somefoo) {
        Logger logger = LoggerFactory.getLogger(somefoo.getClass());
    }
}

writeLogMessagesForFoo 里面,我想要做的是"如果 somefoo 是匿名内部类的一个实例,那么使用它的外部类而不是#34 ;。因此,如果somefoo是来自Outside的内联抽象AFoo,则Outside.class将使用记录器而不是AFoo $ 1.

这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Class.getEnclosingClass()获取外部课程。如果类可以嵌套多个级别,只需循环直到达到顶部。例如:

static Class<?> getOutermostClass(Class<?> clazz) {
    while (clazz.getEnclosingClass() != null) {
        clazz = clazz.getEnclosingClass();
    }
    return clazz;
}

public static writeLogMessagesForFoo(IFoo somefoo) {
    Logger logger = LoggerFactory.getLogger(getOutermostClass(somefoo.getClass()));
}

答案 1 :(得分:0)

您所发现的是getEnclosingClass