Java反射:将子类实例称为超级实例

时间:2013-06-01 14:45:01

标签: java reflection

考虑以下事项:

public class A {
    public String name = "i am a A instance";
}
public class B extends A {
    public String name = "i am a B instance";
}

public class ReflectTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        A ainstance = new A();
        A binstance = new B();
        B bbinstance = new B();
        System.out.println(bbinstance.name);
        System.out.println(ainstance.getClass().cast(binstance).name);
        System.out.println(ainstance.getClass().cast(bbinstance).name);
        System.out.println(ainstance.getClass().cast(binstance).getClass());
        System.out.println(ainstance.getClass().cast(bbinstance).getClass());
    }

}

输出是:

i am a B instance
i am a A instance
i am a A instance
class cs236703.s2013.hw4.tests.B
class cs236703.s2013.hw4.tests.B

有没有办法操纵java反射在最后2个printlns中返回A类而不是B类?

1 个答案:

答案 0 :(得分:4)

  

有没有办法操纵java反射在最后2个printlns中返回A类而不是B类?

没有。

getClass()方法返回目标方法的实际类,无论您将对象的引用转换为什么。您不能使用简单的Java或使用反射来更改它。

(理论上可以在本地库中做一些干扰对象类型的幕后恶意。但这可能是不可移植的,非常不安全而不是一个理智的程序员应该考虑做的事情......)