轉(zhuǎn)載請注明出處:
http://egoistk21.xyz/2016/10/12/淺談Java反射一/
這學(xué)期剛開學(xué)的時候在睿思(我們學(xué)校的BBS)上看到了一個學(xué)長的求助六水,就收藏了盹靴,那時候自己還在搭建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方法偏瓤。
這題不能想當(dāng)然地在C類里面加一個A類的成員腿堤,要訪問一個編譯時根本無法預(yù)知類型的對象,那必須使用反射波势。那今天我們就來講一下用反射查看類的信息翎朱。
我們先來講一下Java中Class這個類,好比類是一批擁有共同特征的對象的抽象艰亮,Class是這些類的抽象闭翩,也就是說Class是所有類的類。Class 類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口迄埃。Class 沒有公共構(gòu)造方法。Class 對象是在加載類時由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的 defineClass 方法自動構(gòu)造的兑障。例如car.getClass().getName(); 還可以使用一個類字面值來獲取指定類型(或 void)的 Class 對象侄非。例如蕉汪,Car.class.getName(); 有了獲取正在運(yùn)行的 Java 應(yīng)用程序中的類的方法,接下來就好辦了逞怨。
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();
}
}
}
下一篇我來講一下怎么用反射調(diào)用私有屬性和方法(setAccessible)者疤。
晚安。