国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JAVA reflect

2019-11-06 08:31:47
字體:
來源:轉載
供稿:網友

java reflect


看了視頻,老師講的很細,寫點note, 自己的理解,可能有誤.僅供自己參考.

Class類的使用:

在面向對象的世界里,萬物都是對象. 在java語言中,靜態成員和普通的數據類型不是面向對象.但普通數據對象有封裝,例如integer 任何類是java.lang.class類的事例對象.這個實例對象有三種表示方法. Foo foo1 = new Foo(); /*foo1 是 Foo的實例化對象表示,而Foo又是Java.Lang.Class的實例化對象,我們稱之為類類型,也就是說任何類都是lang.Class的實例化對象,而Class是不允許new Class()的, 這個實例化對象有三種表示方法*/ Class c1 = Foo.class //知道類名 Class c2 = foo1.getClass()//知道類的實例化對象 Class c3 = Class.forName("類的全稱");// 知道類的全稱 //c1 == c2 == c3,類類型 //我們可以通過類的類類型創建該類的對象實例 Foo foo = c1.newInstance(); //就能得到這個類對象, 需要無參的構造方法
2. Class.forName("類的全稱"),不僅代表了類的類類型,類(java.lang.class)的類類型(c1),還代表了動態加載類。2.1 編譯是靜態加載類,運行時刻是動態加載類。2.2 new 對象是靜態加載類,在編譯時刻就需要加載所有可能使用到的類3.

方法的反射

Method[] methods = c1.getMethods(); //public 和從父類獲得的方法 Method[] methods = c2.getDeclaredMethods();//該類所聲明的所有方法

然后根據方法獲得方法的方法名,返回值類型,參數類型信息等 得到方法名: String methodName = methods[i].getName(); 得到返回值類類型: Class returnType = methods[i].getReturnType(); 返回值類型: returnType.getName(); 得到參數的類類型: Class[] params = methods[i].getParameterTypes(); 參數類型: params[i].getName();


成員變量的操作

Field[] fields = c.getFields(); //public Field[] fields = c.getDeclaredFields() //該類所有的成員變量 然后獲得該成員變量的類類型,類名字,成員變量的名字, 類類型:Class fieldType = fields[i].getType(); 類名字:String typeName = fieldType.getName(); 變量名字:String fieldName = fields[i].getName

構造函數

Class c = Class.forName(“完整的類名”); Constructor[] cs = c.getConstructors(); Constructor[] cs = c.getDeclaredConstructors();//獲取該類的構造函數 構造函數參數類類型:Class[] paramTypes = cs[i].getParameterTypes(); 構造函數參數類型: paramTypes[i].getName()

方法的反射操作

先獲得method,需要拿到類類型,方法名,方法參數 Class c1 = a.getClass(); Method method = c1.getMethod(“方法名”, 方法參數類型); 最后方法的反射操作 method.invoke(a, 2, 5); 如果沒有返回值,返回null, 有返回值,則返回得到的值

泛型的本質

ArrayList<String> list1 = new ArrayList<String>();ArrayList<Integer> list2 = new ArrayList<Integer>();list1.add("zhangsan");List2.add(10);Class c1 = list1.getClass();Class c2 = list2.getClass();c1==c2 //true 由結果可以知道反射的操作都是編譯之后的操作。 // 編譯之后的集合泛型是去泛型的(不存在泛型的這樣一說法)。 //編譯之前只是為了防止錯誤輸入。

java 中的集合泛型只是為了防止錯誤輸入,只在編譯階段有效。 反射的操作都是編譯之后的操作。 如果要進行驗證,可以繞過編譯操作,也就可以繞過了泛型 也就是用泛型的method.invoke()方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广西| 疏勒县| 潞城市| 措美县| 紫云| 藁城市| 绥宁县| 尉氏县| 云林县| 梁平县| 博客| 辉南县| 赣州市| 卢湾区| 萝北县| 鹿泉市| 疏附县| 日照市| 海门市| 河东区| 蒲江县| 门源| 鄱阳县| 永胜县| 廊坊市| 呼和浩特市| 应城市| 湟源县| 融水| 温宿县| 和田市| 徐闻县| 获嘉县| 镇江市| 曲靖市| 梅河口市| 滦南县| 滁州市| 龙口市| 三门县| 宁都县|