標籤:類載入機制 java語言 世界 ring rgs public 使用 system 位元組碼
Java-Reflect專題
1. Class類的使用
2. 方法的反射
3. 成員變數的反射
4. 建構函式的反射
5. Java類載入機制
Class類
1. 在物件導向的世界裡,萬事萬物皆對象。
Java語言中,靜態成員、普通資料類型類是不是對象呢?
類是誰的對象呢?
類是對象,類是java.lang.Class類的執行個體對象(There is a class named Class)
public class Main { public static void main(String[] args) { //Foo的執行個體對象如何表示 Foo fool = new Foo(); //Foo這個類 也是一個執行個體對象,Class類的執行個體對象,如何表示呢 //任何一個類都是Class的執行個體對象,這個執行個體對象有三種表示方式 //第一種表示方式--->實際在告訴我們任何一個類都有一個隱含的靜態成員變數class Class c1 = Foo.class; //第二種表示方式 已經知道該類的對象通過getClass方法 Class c2 = fool.getClass(); /* * 官網c1,c2表示了Foo類的類類型(class type) * 萬事萬物皆對象, * 類也是對象,是Class類的執行個體對象 * 這個對象我們稱為該類的類類型 */ //不管c1 or c2都代表了Foo類的類類型,一個類只可能是Class類的一個執行個體對象 System.out.println(c1 == c2);//true //第三種表達方式 Class c3 = null; try { c3 = Class.forName("Foo");//類的全路徑名 } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(c3 == c2);//true //我們完全可以通過類的類類型建立該類的對象執行個體 try { Foo foo = (Foo) c1.newInstance(); foo.print();//foo } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }}class Foo{ void print(){ System.out.println("foo"); }}
2. Class.forName("類的全稱")
不僅表示了類的類類型,還代表了動態載入類
請大家區分編譯、運行
編譯時間刻載入類是靜待載入類、運行時刻載入類是動態載入類
3. 基本的資料類型對應的類類型
public class ClassDemo2 { public static void main(String[] args) { Class c1 = int.class;//int的類類型 Class c2 = String.class;//String的類類型 String類位元組碼 Class c3 = double.class; Class c4 = Double.class; Class c5 = void.class; System.out.println(c1.getName());//int System.out.println(c2.getName());//java.lang.String //不包含包名的類的名稱 System.out.println(c2.getSimpleName());//String System.out.println(c3.getName());//double System.out.println(c4.getName());//java.lang.Double System.out.println(c5.getName());//void }}
4. Class類的基本API操作
擷取類所有的方法的資訊
public class ClassDemo { public static void main(String[] args) { String s = "hello"; ClassUtil.printClassMessage(s); }}
public class ClassUtil { /** * 列印類的資訊,包括類的成員函數、成員變數 * @param object 該對象所屬類的資訊 */ public static void printClassMessage(Object object){ //要擷取類的資訊 首先要擷取類的類類型 Class c = object.getClass();//傳遞的是哪個子類的對象 c就是該子類的類類型 //擷取類的名稱 System.out.println("類的名稱是:"+c.getName()); /* *Method類,方法對象 * 一個成員方法就是一個Method對象 * getMethods()方法擷取的是所有的public的函數,包括父類繼承而來的 * getDeclaredMethods()擷取的是所有該類自己聲明的方法,不論存取權限 */ Method[] ms = c.getMethods();//c.getDeclaredMethods(); for (int i=0; i<ms.length; i++){ //得到方法的傳回值類型的類類型 Class returnType = ms[i].getReturnType(); System.out.print(returnType.getName()+" "); //得到方法的名稱 System.out.print(ms[i].getName()+"("); //擷取參數類型--->得到的是參數列表的類型的類類型 Class[] paramTypes = ms[i].getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class1.getName()); } System.out.println(")"); } }}
擷取成員變數的資訊
Java進階-反射機制