这学期刚开学的时候在睿思(我们学校的BBS)上看到了一个学长的求助,就收藏了,那时候自己还在搭建Hexo博客,没时间研究,昨天就去翻看了一下,原题如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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 应用程序中的类的方法,接下来就好办了。
1 2 3 4 5 6 7 8 9 10 11 12
| 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(); } } }
|
或者下面这个更好的
1 2 3 4 5 6 7 8 9 10 11
| 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)。
晚安。