Class類
Class類的實例表示java應用運行時的類或接口(每個java類在運行的時候都會在JVM裏表現爲一個Class對象,可以通過類名.Class
,類型.getClass()
,Class.forName("包.類名")
等方法獲取Class對象)
Class類的特點
Class類的父類是Object,事實上,任何java類,不管是jdk裏面的還是自定義的,都是Class類的對象,同時,所有的數據類型、關鍵字、方法等等,一切的一切都是Class類的對象。這是前提,很關鍵
Class類的運行原理
java種創建對象時不是通過類直接創建的,一個類的對象被創建之前,首先JVM會加載該類的字節碼文件(.class文件),也就是編譯後的java程序文件;加載完成後,JVM會自動的爲該類創建自己的Class對象,再通過Class對象創建目標對象
使用Class的目的
很簡單的一句話,可以利用反射機制重新獲取到Object對象,這個是動態加載類以及對象的,是在程序運行時纔會發生的動作,至於反射機制的具體應用,先挖個坑,以後填
API文檔的仿製
按照Class類的特性,java種的一切都是Class類的對象,我們可以獲取到這些“對象”的信息,比如任意類的屬性、構造方法、所有方法等等信息,誠然,我們甚至可以做出一個API文檔
public static void main(String[] args) throws ClassNotFoundException{
// 1.返回與帶有給定字符串名的類或接口相關聯的 Class 對象,直接導致該類被初始化
Class testClass = Class.forName("java.lang.Class");
// 2. 獲取該類的實例化對象
Class testClass2 = Class.class;
// 3.獲取該類的實例化Class對象
Class testClass3 = new Test().getClass();
String target = "([a-zA-Z_-]+)\\."; // 需要匹配的正則表達式,表示了形如“字母+.”的模式,這樣便去除了某個類的包名前綴
Class<? super Object> superC = testClass.getSuperclass();
String name = superC.getName();
System.out.print("Class的父類是:" + name.replaceAll(target, "") + "\n");
Constructor<Class>[] consClass = testClass.getDeclaredConstructors();
System.out.println("Class的構造方法有:");
for(Constructor con : consClass){
name = con.toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
Class<Class>[] classes = testClass.getClasses();
System.out.println("Clsass所有的成員的公共類和接口:");
if(classes.length==0)
System.out.println("null");
for(Class cla : classes){
name = cla.toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
System.out.println("Class的屬性是:");
Field[] fields = testClass.getDeclaredFields();
for(Field f : fields){
name = f.toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
Method[] methods = testClass.getMethods();
System.out.println("Class的所有方法是:");
for(int i=0; i<methods.length; i++){
name = methods[i].toString();
name = name.replaceAll(target, "");
System.out.println(name);
}
ClassLoader loader = testClass.getClassLoader();// 如果對象是基本類型或者是void,則返回null
System.out.println("Class的類加載器是:" + loader);
這只是一個簡單的思路介紹,重要的是從0到1的過程,至於怎麼從1到n,這需要更多的努力。