【问题标题】:Introspection in JavaJava中的自省
【发布时间】:2012-10-27 13:26:54
【问题描述】:

我有一堆对象,在这个堆栈中我推送 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
}

Inside method(Stack s) instanceof 有效,outside 无效,但是 toString() 方法可以正常工作,它为每个类返回正确的 String。

【问题讨论】:

  • 您遇到异常了吗?或者任何编译器错误?你能把代码贴在你做instanceof检查的地方吗?方法?
  • 你确定方法不返回null吗?
  • while(stack has two elements) 好像也很奇怪
  • 是的,应该是while (stack has two or more than two elements)
  • 如果魔法 while 类似于 while (!stack.isEmpty()) 那么在调用 return stack.pop() 时你会得到一个 EmptyStackException。

标签: java object introspection


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我的代码有错误,谢谢你的解释
猜你喜欢
  • 2012-10-31
  • 2012-03-27
  • 1970-01-01
  • 2010-11-12
  • 2014-05-30
  • 2013-02-22
  • 1970-01-01
  • 2023-04-06
  • 2017-07-18
相关资源
最近更新 更多