ast*_*eri 5 java polymorphism casting instanceof
我一直在玩这个,到目前为止我还没有找到任何隐藏或欺骗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();
}
}
Run Code Online (Sandbox Code Playgroud)
这些类被定义为...
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
Run Code Online (Sandbox Code Playgroud)
所以基本上,有没有办法隐藏这些信息或以某种方式丢失类型信息?我不问是因为我有理由这样做,而是想知道并在将来有可能时保持警惕。另外,我只是觉得它很有趣。
您可能会与instanceofJVM 混淆,但不会。
不同包中同名的类是不一样的。这意味着你可以做
// in one class
ClassA classA = new ClassA(); // package1.ClassA
another.test(classA);
// calls in another class
public void test(Object o) {
if (o instanceof ClassA) // package2.ClassA => false
Run Code Online (Sandbox Code Playgroud)使用不同的类加载器,包和o.getClass().getName()是相同的,但由于类加载器不同,instanceof返回 false。
null始终null instanceof ClassB为 false,即使null可以分配给任何引用类型。