是否可以从匿名内部 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
。
我有一个有点不典型的日志记录情况,我想代表外部 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
。