17

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

class Outer{
    class Inner{}
}

有没有办法检查任意Object是否是 any 的实例Inner,而不管其外部对象如何?instanceof当对象不是Inner来自相同的 s时给出 false Outer。我知道一种解决方法只是制作Inner一个静态类,但我想知道我所问的是否可行。

例子:

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
4

6 回答 6

19

那么呢?

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

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

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

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

于 2013-07-04T11:00:55.787 回答
4

o instanceof Outer.Inner给出falsewheno是 an 的实例,InnerOuter不是您从中调用它的实例。

这不会发生在我身上 -true无论o instanceof Inner属于哪个特定的封闭实例,Outer我都会得到o

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 测试。

于 2013-07-04T12:01:35.043 回答
2

你总是可以:

getClass().getName()

并进行字符串比较。

编辑:考虑继承(在内部类中?谁会这样做?!)你总是可以循环getSuperclass()并检查它们,甚至可以实现接口。

于 2013-07-04T10:42:01.900 回答
2

您是否尝试过使用getEnclosureClass()

返回基础类的直接封闭类。如果底层类是顶级类,则此方法返回 null。

Outer.class.equals(object.getClass().getEnclosingClass())

得到对象的正确封闭类,恕我直言不是那么容易。读这个

有点黑客行为是:

object.getClass().getName().contains("Outer$");
于 2013-07-04T10:43:50.690 回答
0

java.lang.Class.getEnclosingClass()方法返回底层类的直接封闭类。如果此类是顶级类,则此方法返回 null。

以下示例显示了 java.lang.Class.getEnclosureClass() 方法的用法:

import java.lang.*;

public class ClassDemo {
   // constructor
   public ClassDemo() {

      // class Outer as inner class for class ClassDemo
      class Outer {

         public void show() {
            // inner class of Class Outer
            class Inner {

               public void show() {
                  System.out.print(getClass().getName() + " inner in...");
                  System.out.println(getClass().getEnclosingClass());    
               }
            }
            System.out.print(getClass().getName() + " inner in...");
            System.out.println(getClass().getEnclosingClass());

            // inner class show() function
            Inner i = new Inner();
            i.show();
         }
      }

      // outer class show() function
      Outer o = new Outer();
      o.show();
   }

   public static void main(String[] args) {
     ClassDemo cls = new ClassDemo();
   }
}

输出

ClassDemo$1Outer inner in...class ClassDemo

ClassDemo$1Outer$1Inner inner in...class ClassDemo$1Outer

于 2013-07-04T10:47:06.723 回答
0

我在谷歌上搜索找到更好的答案,发现那里没有。

这是我所拥有的,效果很好:

    public static boolean isStatic(Class klass) {
            return Modifier.isStatic(klass.getModifiers());
    }

    /**
     * Non static inner class
     */
    public static boolean isInnerclass(Class klass) {
            return klass.getDeclaringClass() != null && !isStatic(klass);
    }

将为本地内部类返回 true。isMemberClass 和其他人不适用于此目的。

于 2015-08-16T19:01:26.197 回答