繁体   English   中英

Java自省

[英]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。

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

  • 如果onull ,则instanceof运算符返回false 根据JLS, null值不是任何类型的实例。

  • 如果ClassBclassA的子类型,则o instanceof ClassA将为ClassB的实例返回true

  • 如果使用类加载器进行复杂的操作,则可以使用不同的类加载器加载相同的“ .class”文件。 如果这样做,将会遇到类的两个“副本”实际上具有不同类型的问题……而instanceof将返回false (此行为也在JLS中指定。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM