1. 程式人生 > >反射 類加載

反射 類加載

red 長度 接口繼承 PE stat 返回 初學 TP method

初學反射,學習內容做了一些筆記,比較雜亂:

1、類是java.lang.Class類的實例對象

2、new 創建對象,是靜態加載類,在編譯時刻就需要加載可能使用到的類。

3、Class c = user.getClass(); //已知該類的對象,可通過getClass方法獲取該類的類類型

  Class c = Class.forName("類的全稱"); //不僅表示了該類的類類型,還代表了動態加載類,運行時加載類是動態加載

  Word w = (Word)c.newInstance(); //通過類類型,創建該類的對象

4、基本數據類型、void關鍵字等都存在類類型

 1 package com.reflect;
2 3 /** 4 * @author 作者:方o丈 5 * @version 創建時間:2018年6月9日 下午2:20:24 6 * 類說明: 7 */ 8 public class Test { 9 10 public static void main(String[] args) { 11 Class c1 = int.class; 12 Class c2 = double.class; 13 Class c3 = Double.class; 14 Class c4 = String.class; 15
Class c5 = void.class; 16 17 System.out.println(c1.getName()); 18 System.out.println(c2.getName()); 19 System.out.println(c3.getName()); 20 System.out.println(c3.getSimpleName()); 21 System.out.println(c4.getName()); 22 System.out.println(c4.getSimpleName());
23 System.out.println(c5.getName()); 24 } 25 26 }

程序運行結果:

技術分享圖片

5、Class類的API操作:獲取類的信息

 1 package com.reflect;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 /**
 6  * @author 作者:方o丈
 7  * @version 創建時間:2018年6月9日 下午9:55:59 類說明:
 8  */
 9 public class Demo {
10 
11     /**
12      * 獲取類的信息,包括類的成員函數、成員變量
13      * @param obj 該對象所屬類的信息
14      */
15     public static void getClassMessage(Object obj) {
16         // 首先獲取類的類類型
17         Class c = obj.getClass();
18         // 獲取類的名稱
19         String className = c.getName();
20         System.out.println("類的名稱:" + className);
21 
22         /**
23          * Method類,方法對象
24          * 
25          * 獲取類的方法 getMethods()獲取該類所有的public方法,包括從父類繼承來的
26          * 官網註釋:返回一個數組,該數組包含反映由該Class對象表示的類或接口的所有公共方法的方法對象,
27          * 包括由類或接口聲明的方法以及從超類和超接口繼承的方法。如果這個Class對象表示具有多個公共方法的類型,這些方法具有相同的名稱和參數類型,
28          * 但返回類型不同,則返回的數組對於每個此類方法都有一個方法對象。如果這個Class對象表示類初始化方法
29          * <clinit>的類型,則返回的數組沒有相應的方法對象。如果這個Class對象表示數組類型,
30          * 則返回的數組對於數組類型從對象繼承的每個公共方法都有一個方法對象。它不包含克隆()的方法對象。如果這個Class對象表示一個接口,
31          * 則返回的數組不包含任何來自Object的隱式聲明方法。因此,如果在此接口或其任何超接口中沒有顯式聲明任何方法,則返回的數組的長度為0。(
32          * 請註意,表示類的Class對象總是具有從Object繼承的公共方法。)如果這個Class對象表示一個基本類型或void,
33          * 那麽返回的數組的長度為0。在類或由這個Class對象表示的接口的超級接口中聲明的靜態方法不被視為類或接口的成員。返回數組中的元素沒有排序,
34          * 也沒有按任何特定順序排序。
35          * 
36          * getDeclaredMethods() 獲取該類所有的自己聲明的方法,不管是什麽什麽訪問權限。但不包含從父類繼承來的
37          * 官方註釋:如果這個Class對象表示具有多個聲明方法的類型,這些方法具有相同的名稱和參數類型,但返回類型不同,
38          * 則返回的數組對於每個此類方法都有一個方法對象。如果這個Class對象表示具有類初始化方法
39          * <clinit>的類型,則返回的數組沒有相應的方法對象。如果這個Class對象表示沒有聲明方法的類或接口,則返回的數組長度為0。
40          * 如果這個Class對象表示數組類型、基元類型或空類型,則返回的數組長度為0。返回數組中的元素沒有排序,也沒有按任何特定順序排序。
41          * 
42          */
43         Method[] method = c.getMethods();
44         for (int i = 0; i < method.length; i++) {
45             //獲取方法的返回值的類類型
46             Class returnTyepe = method[i].getReturnType();
47             //獲取方法返回值類型名
48             System.out.print(returnTyepe.getName()+" ");
49             
50             //獲取方法的名稱
51             System.out.print(method[i].getName()+"(");
52             
53             //獲取參數列表的類型的類類型
54             Class[] paramTypes = method[i].getParameterTypes();
55             for (Class paramType : paramTypes) {
56                 System.out.print(paramType.getName()+",");
57             }
58             System.out.println(")");
59         }
60     }
61     
62     public static void main(String[] args) {
63         Test test = new Test();
64         getClassMessage(test);
65     }
66 }

? 運行結果:

技術分享圖片

反射 類加載