java - Java 中的自省(introspection)

标签 java object introspection

我有一个对象堆栈,在这个堆栈中我推送 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不起作用时,它无法再区分ClassA和ClassB

Object o = method(s);
if ( o instanceof ClassA){
    //do something
} else if (o instanceof ClassB) {
    //do something else
}

内部方法(Stack s)instanceof有效,外部无效,但toString()方法工作正常,它为每个类返回正确的字符串。

最佳答案

在某些情况下,您的内省(introspection)代码可能无法按您的预期工作:

  • 如果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/

相关文章:

java - ProcessBuilder 不显示命令窗口

java - eclipse servlet问题

java - 渲染 Play framework 2.0.2 模板的一部分

java - 我如何从查询中的两个表中获取数据?

objective-c - 是否有任何内省(introspection)方法来获取 Objective-C 中的类的所有采用的协议(protocol)?

node.js - 如何在 Graphql 中删除内省(introspection)查询的身份验证

javascript - 哈希与特定参数

c++ - 如何在用户输入的情况下创建类的对象数组?

javascript - 带有数组的对象

cocoa - 是否有任何工具可以检查窗口或 View 的类构造层次结构?