回顧: Class 對象:在加載類時由 Java 虛拟機以及通過調用類加載器中的 defineClass 方法自動構造的。通過Class執行個體得到類的資訊的手段成為反射
Class對象擷取的三種法法:
//方法一:Class class對象名 = 類名.class
Class cls1 = String.class;
//方法二:Class class對象名 = 對象.getClass()
String s = "chengyuan";
Class cls2 = s.getClass();
//方法三:Class class對象名 = Class.forName("類名");
Class cls3 = Class.forName("java.lang.String");
本文重點:
1、擷取父類的Class執行個體
public Class<? super T> getSuperclass()傳回表示此 Class 所表示的實體(類、接口、基本類型或 void)的超類的 Class。如果此 Class 表示 Object 類、一個接口、一個基本類型或 void,則傳回 null。如果此對象表示一個數組類,則傳回表示該 Object 類的 Class 對象。
注意:Object是祖宗類,它的父類是null
Interface是沒有父類的 是以也是null
2、擷取目前類的直接實作interface : 接口繼承關系
public Class<?>[] getInterfaces() 确定此對象所表示的類或接口實作的接口。 如果此對象表示一個類,則傳回值是一個數組,
它包含了表示該類所實作的所有接口的對象。數組中接口對象順序與此對象所表示的類的聲明的 implements 子句中接口名順序一緻。
3、判斷一個向上轉型是否成立
public boolean isAssignableFrom(Class<?> cls) 判定此 Class 對象所表示的類或接口與指定的 Class 參數所表示的類或接口是否相同,或是否是其超類或超接口。
代碼示範:
public class ReflectionExtend {
public static void main(String[] args) {
Class clsFu = Fu.class;
Class clsZi = Zi.class;
Class clsSuper = clsZi.getSuperclass();
System.out.println(clsSuper.getName());
//測試Object的父類,和接口的父類
System.out.println(Object.class.getSuperclass());
System.out.println(Runnable.class.getSuperclass());
System.out.println("接口的繼承關系=====================");
Class[] ifs = Integer.class.getInterfaces();
Class[] ArrIfs = java.util.ArrayList.class.getInterfaces();
for(Class aIfs :ArrIfs){
System.out.println(aIfs);
}
System.out.println("判斷一個向上轉型是否成立=====================");
System.out.println(Fu.class.isAssignableFrom(Zi.class));
}
}
class Fu {
}
class Zi extends Fu{
}