Java:如何检查对象是否是非静态内部类的实例,而不考虑外部对象?
如果我有一个内部类,例如Java:如何检查对象是否是非静态内部类的实例,而不考虑外部对象?,java,inner-classes,instanceof,Java,Inner Classes,Instanceof,如果我有一个内部类,例如 class Outer{ class Inner{} } 有没有办法检查任意对象是否是任何内部的实例,而不管其外部对象是什么instanceof给出false。我知道一个解决方法就是将内部变成一个静态类,但我想知道我所要求的是否可行 例如: class Outer{ Inner inner = new Inner(); class Inner{} public boolean isInner(Object o){ re
class Outer{
class Inner{}
}
有没有办法检查任意对象
是否是任何内部
的实例,而不管其外部对象是什么<当对象不是来自同一外部的内部s时,code>instanceof
给出false。我知道一个解决方法就是将内部
变成一个静态类,但我想知道我所要求的是否可行
例如:
class Outer{
Inner inner = new Inner();
class Inner{}
public boolean isInner(Object o){
return o instanceof Inner;
}
}
你可以随时:
getClass().getName()
并进行字符串比较
编辑:要考虑继承(在内部类之间?谁会这样做?!),您可以始终循环通过getSuperclass()
,并检查它们,甚至跟踪实现的接口。您是否尝试使用:
返回基础类的立即封闭类如果基础类是顶级类,则此方法返回null。
要获得对象的正确封闭类,IMHO并不那么容易。阅读
有点像黑客的是:
object.getClass().getName().contains("Outer$");
java.lang.Class.GetEnclosuringClass()
方法返回基础类的立即封闭类。如果该类是顶级类,则该方法返回null
以下示例显示了java.lang.Class.GetEnclosuringClass()方法的用法:
输出
ClassDemo$1外部内部在…类ClassDemo
ClassDemo$1外部$1内部输入…类ClassDemo$1外部
那怎么办
public static boolean isInnerClass(Class<?> clazz) {
return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers());
}
公共静态布尔值isInnerClass(类clazz){
返回clazz.isMemberClass()&&!Modifier.isStatic(clazz.getModifiers());
}
该方法将测试该方法是否是成员(而不是匿名或本地类),第二个条件将验证您的成员类是否是静态的
顺便说一下,解释了本地类、匿名类和嵌套类之间的区别
嵌套类分为两类:静态类和非静态类。声明为静态的嵌套类称为静态嵌套类。非静态嵌套类称为内部类
当o
是任何外部
的内部
实例时,内部
给出false
,而不是从中调用它
这不会发生在我身上-对于o instanceof internal
我得到true
,无论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();
}
}
用Java6和Java7进行测试。我在谷歌上搜索,寻找更好的答案,发现根本没有答案
以下是我所拥有的非常有效的:
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和其他工具不适用于此目的。@IanRoberts-为什么不?无论父对象是什么,2个内部实例都将具有相同的完全限定类名是的,但是如果Inner2扩展了Inner
,那么类为Inner2
的对象就是Inner
的实例,即使它们的类名不同。@IanRoberts-没错。但仍然可以修复:-)(编辑传入)类的名称不会显示其是否为静态。但这也适用于任何假设的OtherInner?你能提供一个例子,说明instanceof internal
返回false吗?@cambecc,o instanceof Outer.internal
在o
是任何Outer
的internal
的实例而不是你调用它的实例时,给出false。不确定你的意思是什么“任何外部
,而不是您呼叫的那一个“。一个快速的代码示例对于回答您的问题非常有用。你的意思不是说Outer.internal
和OtherOuter.internal
应该是相同的internal
,是吗?@cambecc,包括例子。谢谢你的例子。只是试着运行它;结果为true
。您确定看到false
?false
的结果将违反JLS§15.20.2,其中规定:“在运行时,如果RelationalExpression的值不为null,则instanceof运算符的结果为true,并且可以将引用转换为ReferenceType,而不会引发ClassCastException。”我们知道outer2。inner
可以强制转换为inner
,因为这是它的类型。尝试将isInner
的参数更改为typeinternal
,您将看到不需要显式强制转换,也不会发生编译错误。不确定为什么会看到false
。请注意,isMemberClass()
为匿名类和本地类返回false(这很有意义,但可能会令人惊讶)。如果您对这些类类型感兴趣,请使用和。
public static boolean isInnerClass(Class<?> clazz) {
return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers());
}
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();
}
}
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);
}