我有一个非常典型的日志记录情况,我只想提供一个匿名内部类的实例,我想代表外部类编写一条日志消息。我正在使用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.
这可能吗?
答案 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
。