我有一堆对象,在此堆栈中,我推送了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。

最佳答案

在某些情况下,自省代码可能无法按预期工作:


如果onull,则instanceof运算符将返回false。根据JLS,null值不是任何类型的实例。
如果ClassBclassA的子类型,则o instanceof ClassA将为true的实例返回ClassB
如果使用类加载器进行复杂的操作,则可以使用不同的类加载器加载相同的“ .class”文件。如果这样做,将遇到类的两个“副本”实际上具有不同类型的问题,并且instanceof将返回false。 (此行为也在JLS中指定。)


最后一种情况可能会特别令人困惑,因为当您查看两个类的名称时,它们将是相同的。但是class1.equals(class2)class1 == class2将为您提供有关两个类实际上是否相同的明确答案。

关于java - Java自省(introspection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13100590/

10-12 00:27
查看更多