是否可以从匿名内部 class 的实例中确定外部 class 的 class 名称

Is it possible to determine the classname of an outer class from an instance of an anonymous inner class

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

假设我有一个 class:

public abstract class AFoo implements IFoo

然后我有一个外部 class,它有一个带有抽象内部 IFoo class:

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

第三,我有一些实用程序 class 可以生成一些日志消息:

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

writeLogMessagesForFoo 里面,我想做的是说 "if somefoo is an instance of an anonymous inner class, then use its outer class instead"。因此,如果 somefoo 是来自 Outside 的内联抽象 AFoo,那么 Outside.class 将是使用的记录器,而不是 AFoo$1.

这可能吗?

你可以用Class.getEnclosingClass()得到外面的class。如果 classes 可以嵌套多层,则循环直到到达顶部。例如:

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()));
}

您找到的是 getEnclosingClass