转载请注明出处:
http://egoistk21.xyz/2016/10/12/浅谈Java反射一/
这学期刚开学的时候在睿思(我们学校的BBS)上看到了一个学长的求助,就收藏了,那时候自己还在搭建Hexo博客,没时间研究,昨天就去翻看了一下,原题如下:
public class A {
protected String getString() {
return "A";
}
}
public class B extends A {
protected String getString() {
return "B";
}
}
public class C extends B {
}
要求在子类C的对象中访问其父类的父类A中的getString方法。
这题不能想当然地在C类里面加一个A类的成员,要访问一个编译时根本无法预知类型的对象,那必须使用反射。那今天我们就来讲一下用反射查看类的信息。
我们先来讲一下Java中Class这个类,好比类是一批拥有共同特征的对象的抽象,Class是这些类的抽象,也就是说Class是所有类的类。Class 类的实例表示正在运行的 Java 应用程序中的类和接口。Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。例如car.getClass().getName(); 还可以使用一个类字面值来获取指定类型(或 void)的 Class 对象。例如,Car.class.getName(); 有了获取正在运行的 Java 应用程序中的类的方法,接下来就好办了。
public class C extends B {
public static void main (String args[]){
Class a = C.class.getSuperclass().getSuperclass();
try {
Object o = a.newInstance();
A c = (A)o;
System.out.println(c.getString());
} catch(Exception e) {
e.printStackTrace();
}
}
}
或者下面这个更好的
public class C extends B {
public static void main (String args[]){
Class a = C.class.getSuperclass().getSuperclass();
try {
Method m = a.getDeclaredMethod("getString",null);
System.out.println(m.invoke(a.newInstance(),null));
} catch (Exception e) {
e.printStackTrace();
}
}
}
下一篇我来讲一下怎么用反射调用私有属性和方法(setAccessible)。
晚安。