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

2022-09-03 01:00:03

如果我有一个内部类,例如

class Outer{
    class Inner{}
}

有没有办法检查任意是否为 any 的实例,而不管它的外部对象是什么? 当对象不是来自同一对象的 s 时,给出 false。我知道解决方法是制作一个静态类,但我想知道我所要求的是否可能。ObjectInnerinstanceofInnerOuterInner

例:

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

    public boolean isInner(Object o){
        return o instanceof Inner;
    }
}


Outer outer1 = new Outer();
Outer outer2 = new Outer();
boolean answer = outer1.isInner(outer2.inner); //gives false

答案 1

那呢?

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

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

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

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


答案 2

o instanceof Outer.Inner给出的 when 是除您从中调用它之外的任何实例的实例。falseoInnerOuter

这对我来说不会发生 - 无论属于哪个特定的封闭实例,我都会得到:trueo instanceof InnerOutero

class Outer {
  class Inner {}

  void test() {
    // Inner instance that belongs to this Outer
    Inner thisInner = new Inner();

    // Inner instance that belongs to a different Outer
    Outer other = new Outer();
    Inner otherInner = other.new Inner();

    // both print true
    System.out.println(thisInner instanceof Inner);
    System.out.println(otherInner instanceof Inner);
  }

  public static void main(String[] args) {
    new Outer().test();
  }
}

使用 Java 6 和 7 进行了测试。