Java:如何检查对象是否是非静态内部类的实例,而不管外部对象是什么?

Nav*_*eur 17 java instanceof inner-classes

如果我有一个内部阶级,例如

class Outer{
    class Inner{}
}
Run Code Online (Sandbox Code Playgroud)

有没有办法检查任意Object是否是任何实例Inner,无论其外部对象是什么?instanceof当对象不是Inner相同的时候给出错误Outer.我知道一个解决方法只是制作Inner一个静态类,但我想知道我问的是否可行.

例:

class Outer{
    Inner inner = new Inner();
    class Inner{}

    public boolean isInner(Object o){
        return o instanceof Inner;
    }
}
Run Code Online (Sandbox Code Playgroud)


Outer outer1 = new Outer();
Outer outer2 = new Outer();
boolean answer = outer1.isInner(outer2.inner); //gives false
Run Code Online (Sandbox Code Playgroud)

Lau*_*ntG 18

那怎么样?

public static boolean isInnerClass(Class<?> clazz) {
    return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers());
}
Run Code Online (Sandbox Code Playgroud)

该方法isMemberClass()将测试该方法是否为成员(而不是匿名或本地类),第二个条件将验证您的成员类是否不是静态的.

顺便说一句,文档解释了本地,匿名和嵌套类之间的差异.

嵌套类分为两类:静态和非静态.声明为static的嵌套类简称为静态嵌套类.非静态嵌套类称为内部类.

  • 只是要注意,“isMemberClass()”对于匿名类和本地类返回 false(这是有道理的,但可能会令人惊讶)。使用 [`isAnonymousClass()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isAnonymousClass--) 和 [`isLocalClass()`](https: //docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isLocalClass--) 如果您对这些类类型感兴趣。 (3认同)

rad*_*dai 2

你总是可以:

getClass().getName()
Run Code Online (Sandbox Code Playgroud)

并进行字符串比较。

编辑:为了考虑继承(在内部类之间?谁会这样做?!),您可以随时循环getSuperclass()并检查它们,甚至可以跟踪实现的接口。