【发布时间】:2012-10-16 13:59:36
【问题描述】:
我一直在玩这个,到目前为止,我还没有找到任何方法来隐藏或欺骗 instanceof 通过层层混淆隐藏其类型来返回 false,但这并不意味着这是不可能的,因为我远不是最了解 Java 的人。所以特地来请教专家。
我尝试了以下组合,在每种情况下,instanceof 运算符都能够识别对象的真实/基本类型。
public class Test {
public static void main(String[] args) {
Object o = new TestObject();
printType("Base Class", o);
o = (TestSuperObject)(new TestObject());
printType("Super Class", o);
o = (TestInterface)(new TestObject());
printType("Interface", o);
o = (TestInterface)((TestSuperObject3)(new TestObject3()));
printType("Interface on Super Class", o);
o = (TestSuperObject3)((TestInterface)(new TestObject3()));
printType("Super Class on Interface", o);
}
private static void printType(String testCase, Object o) {
System.out.println(testCase);
System.out.println("TestObject:" + (o instanceof TestObject));
System.out.println("TestObject2:" + (o instanceof TestObject2));
System.out.println("TestObject3:" + (o instanceof TestObject3));
System.out.println();
}
}
这些类被定义为...
public class TestObject extends TestSuperObject implements TestInterface
public class TestObject2 extends TestSuperObject implements TestInterface
public interface TestInterface
public class TestSuperObject
public class TestObject3 extends TestSuperObject3
public class TestSuperObject3 implements TestInterface
所以基本上,有没有办法隐藏这些信息或以某种方式丢失类型信息?我不问,因为我有这样做的理由,而是想知道并在未来警惕它,如果它是可能的。另外,我只是觉得它很有趣。
【问题讨论】:
-
并非如此。你只能通过让
instanceof返回一个看起来错误的值来“欺骗”你的直觉。例如,让o的类型为TestObject,但由不同的类加载器加载。 -
+1。但是
instanceof运算符的工作方式;你没有机会。 -
请注意,所有的转换只会改变 variable 或 field 的类型。它从不以任何方式更改指向的对象。 (基本类型的转换略有不同,但不与
instanceof交互)。 -
转换原始类型有何不同?
-
@Jeff:将 1234 转换为
byte确实返回不同的值。将其转换回int不会导致 1234。
标签: java casting polymorphism instanceof