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.Inner
当o
是你正在调用的Outer
的任何Outer
的Inner
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和其他人不能用于此目的。