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

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

class Outer{ class Inner{} } 

有没有办法检查任意Object是否是任何Inner的实例,无论其外部对象是什么? 当对象不是来自同一Outer Inner时, instanceof给出false。 我知道一个解决方法就是让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 

那怎么样?

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

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

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

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

o instanceof Outer.Innero是你正在调用的Outer的任何OuterInner o instanceof Outer.Inner给出false

这对我来说不会发生 – 无论o所属的Outer属于哪个特定封闭实例,我都会对o instanceof Inner实例Outer

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

您是否尝试使用getEnclosingClass() :

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

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

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

有点黑客会是:

 object.getClass().getName().contains("Outer$"); 

你可以永远:

 getClass().getName() 

并进行字符串比较。

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

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

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

 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

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

这是我的工作得很好:

  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和其他人不能用于此目的。