代码之家  ›  专栏  ›  技术社区  ›  Richard Sand

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

  •  0
  • Richard Sand  · 技术社区  · 7 年前

    我有一种有点非典型的日志记录情况,当只提供匿名内部类的实例时,我想代表外部类编写日志消息。我正在使用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公司 是匿名内部类的实例,则改用其外部类”。因此,如果somefoo是来自外部的内嵌抽象AFoo,则Outside.class将是使用的记录器,而不是AFoo$1。

    这可能吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   shmosel    7 年前

    您可以使用 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()));
    }
    
        2
  •  0
  •   Dean Xu    7 年前

    你发现的是 getEnclosingClass .