[英]Introspection in Java
我有一个对象堆栈,在该堆栈中,我推送了ClassA和ClassB对象。 我有一个必须从此堆栈返回对象的方法
public Object method(Stack s){
ClassA a = new ClassA();
stack.push(a);
ClassB b = new ClassB();
stack.push(b);
while(stack has two elements) stack.pop();
return stack.pop()// I return the last element
}
问题是:当我调用此方法instanceof不起作用时,它无法再从ClassB告诉ClassA
Object o = method(s);
if ( o instanceof ClassA){
//do something
} else if (o instanceof ClassB) {
//do something else
}
内部方法(Stack的)instanceof可以工作,外部方法不可以,但是toString()方法可以正常工作,它为每个类返回正确的String。
在某些情况下,自省代码可能无法按预期工作:
如果o
为null
,则instanceof
运算符返回false
。 根据JLS, null
值不是任何类型的实例。
如果ClassB
是classA
的子类型,则o instanceof ClassA
将为ClassB
的实例返回true
。
如果使用类加载器进行复杂的操作,则可以使用不同的类加载器加载相同的“ .class”文件。 如果这样做,将会遇到类的两个“副本”实际上具有不同类型的问题……而instanceof
将返回false
。 (此行为也在JLS中指定。)
最后一种情况可能会特别令人困惑,因为当您查看两个类的名称时,它们将是相同的。 但是, class1.equals(class2)
或class1 == class2
将为您提供有关两个类实际上是否相同的明确答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.