摘要:筆記來(lái)源反射綜述類(lèi)的使用方法的反射成員變量的反射構(gòu)造函數(shù)的反射類(lèi)加載機(jī)制類(lèi)的使用在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。
筆記來(lái)源:IMOOC 反射Java Reflect
Class 類(lèi)的使用綜述
Class類(lèi)的使用
方法的反射
成員變量的反射
構(gòu)造函數(shù)的反射
類(lèi)加載機(jī)制
在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。
但在Java里面有兩樣?xùn)|西不是對(duì)象:靜態(tài)的成員、普通數(shù)據(jù)類(lèi)型類(lèi)(但它們有封裝類(lèi)彌補(bǔ))
類(lèi)是對(duì)象,類(lèi)是 java.lang.Class 的實(shí)例對(duì)象(There is a class named Class)
package com.gcusky.reflect; class ClassDemo { Foo foo = new Foo(); // Foo的實(shí)例對(duì)象 /** * foo 是 Foo 類(lèi)的實(shí)例對(duì)象 * Foo 是 Class 類(lèi)的實(shí)例對(duì)象,又叫類(lèi)類(lèi)型(class type) */ // 表示1 -> 任何一個(gè)類(lèi)都有一個(gè)隱含的靜態(tài)成員變量class Class c1 = Foo.class; // 表示2 -> 已知該類(lèi)對(duì)象可用getClass方法獲取類(lèi)類(lèi)型 Class c2 = foo.getClass(); // 表示3 -> 用類(lèi)的全稱(chēng)獲取 try { Class c3 = Class.forName("com.gcusky.reflect.Foo"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 可以通過(guò)類(lèi)的類(lèi)類(lèi)型創(chuàng)建該類(lèi)的實(shí)例對(duì)象 try { Foo foo1 = (Foo)c1.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } class FooJava 動(dòng)態(tài)加載類(lèi)
Class.forName("類(lèi)的全稱(chēng)")
不僅表示了類(lèi)的類(lèi)類(lèi)型,還代表了動(dòng)態(tài)加載類(lèi)
編譯時(shí)刻加載類(lèi)是靜態(tài)加載類(lèi)
運(yùn)行時(shí)刻加載類(lèi)是動(dòng)態(tài)加載類(lèi)
class Office { public static void main(String[] args) { // new 創(chuàng)建對(duì)象,是靜態(tài)加載類(lèi),在編譯時(shí)就需要加載所有可能使用到的類(lèi) if("Word".equals(args[0])) { Word w = new Word(); w.start(); } // Class.forName 創(chuàng)建對(duì)象,是動(dòng)態(tài)加載類(lèi),在運(yùn)行時(shí)才加載 try { Class c = Class.forName(args[0]) Word w = (Word) c.newInstance(); // 通過(guò)類(lèi)類(lèi)型,創(chuàng)建該對(duì)象 w.start(); } catch (Exception e) { e.printStackTrace(); } } }Java 獲取方法信息
基本的數(shù)據(jù)類(lèi)型,void 關(guān)鍵字都存在類(lèi)類(lèi)型
java.lang.reflect.Method 封裝了關(guān)于方法的操作
package com.gcusky.reflect; import java.lang.reflect.Method; public class Demo { /** * 打印類(lèi)的信息,包括類(lèi)的成員函數(shù)、成員變量 * @param obj 對(duì)象 */ public static void printClassMessage(Object obj) { // 要獲取類(lèi)的信息,首先要獲取類(lèi)的類(lèi)類(lèi)型 Class c = obj.getClass(); // 獲取類(lèi)的全名 String fullName = c.getName(); /** * Method類(lèi):方法對(duì)象 * 一個(gè)成員方法就是一個(gè)Method對(duì)象 * getMethods()方法獲取的是所有的public的函數(shù),包括父類(lèi)繼承而來(lái)的 * getDeclaredMethods() 獲取的是所有該類(lèi)自己聲明的方法,不問(wèn)訪問(wèn)權(quán)限 */ Method[] ms = c.getMethods(); // c.getDeclaredMethods(); for (int i = 0; i < ms.length; i++) { // 得到方法的返回類(lèi)型 Class returnType = ms[i].getReturnType(); // 得到方法的名稱(chēng) String name = ms[i].getName(); // 獲取參數(shù)類(lèi)型 Class[] paramTypes = ms[i].getParameterTypes(); } } }Java 獲取成員變量信息
成員變量也是對(duì)象
java.lang.reflect.Field 封裝了關(guān)于成員變量的操作
/** * 成員變量也是對(duì)象,F(xiàn)ield封裝了關(guān)于成員變量的操作 * getFields()獲取的是所有的public的成員變量 * getDeclaredMethods()獲取的是所有該類(lèi)自己聲明的成員變量 */ Field[] fs = c.getDeclaredFields(); // c.getFields(); for (int i = 0; i < fs.length; i++) { // 得到成員變量的類(lèi)型 Class fieldType = fs[i].getType(); String typeName = fieldType.getName(); // 得到成員變量的名稱(chēng) String fieldName = fs[i].getName(); }Java 獲取構(gòu)造函數(shù)信息
/** * 構(gòu)造函數(shù)也是對(duì)象 * java.lang.Constructor中封裝了構(gòu)造函數(shù)的信息 */ Constructor[] cs = c.getDeclaredConstructors(); for (Constructor constructor : cs) { constructor.getName(); Class[] paramType = constructor.getParameterTypes(); }Java 方法的反射
如何獲取某個(gè)方法:方法的名稱(chēng)和方法的參數(shù)列表才能唯一決定某個(gè)方法
方法反射的操作:method.invoke(對(duì)象, 參數(shù)列表)
class A { public void print(int a, int b) { System.out.println(a + b); } } A a = new A(); Class c = a.getClass(); try { // Method m = c.getMethod("print", new Class[]{int.class, int.class}); Method m = c.getMethod("print", int.class, int.class); // Object o = m.invoke(a, new Object[]{10, 20}); Object o = m.invoke(a, 10, 20); } catch (Exception e) { e.printStackTrace(); }Java 類(lèi)加載機(jī)制
ArrayList list = new ArrayList(); ArrayListlist1 = new ArrayList (); list == list1; // true list1.add(20); // error - 編譯檢測(cè)出錯(cuò)
反射都是編譯之后的操作,因此可看出泛型在編譯之后會(huì)被擦除
Java 中集合的泛型用于防止錯(cuò)誤輸入,只在編譯階段有效,繞過(guò)編譯則無(wú)效
Class c = list1.getclass(); try { Method m = c.getMethod("add", Object.class); m.invoke(list1, 20); // correct - 繞過(guò)編譯操作就繞過(guò)了泛型 } catch (Exception e) { e.printStackTrace(); }
參考資料:
先有Class還是先有Object?
Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69142.html
摘要:當(dāng)某個(gè)類(lèi)型變量只在整個(gè)參數(shù)列表的所有參數(shù)和返回值中的一處被應(yīng)用了,那么根據(jù)調(diào)用方法時(shí)該處的實(shí)際應(yīng)用類(lèi)型來(lái)確定。即直接根據(jù)調(diào)用方法時(shí)傳遞的參數(shù)類(lèi)型或返回值來(lái)決定泛型參數(shù)的類(lèi)型。 標(biāo)簽: java [TOC] 本文對(duì)泛型的基本知識(shí)進(jìn)行較為全面的總結(jié),并附上簡(jiǎn)短的代碼實(shí)例,加深記憶。 泛型 將集合中的元素限定為一個(gè)特定的類(lèi)型。 術(shù)語(yǔ) ArrayList -- 泛型類(lèi)型 ArrayLis...
摘要:知識(shí)點(diǎn)總結(jié)反射反射操作泛型知識(shí)點(diǎn)總結(jié)反射采用泛型擦除的機(jī)制來(lái)引入泛型。中的泛型僅僅是給編譯器使用的,確保數(shù)據(jù)的安全性和免去強(qiáng)制類(lèi)型轉(zhuǎn)換的麻煩。 Java知識(shí)點(diǎn)總結(jié)(反射-反射操作泛型) @(Java知識(shí)點(diǎn)總結(jié))[Java, 反射] Java采用泛型擦除的機(jī)制來(lái)引入泛型。Java中的泛型僅僅是給編譯器javac使用的, 確保數(shù)據(jù)的安全性和免去強(qiáng)制類(lèi)型轉(zhuǎn)換的麻煩 。但是,__一旦編譯完成,...
摘要:構(gòu)造器創(chuàng)建實(shí)例構(gòu)造器和方法的反射類(lèi)不同點(diǎn)在于,可以創(chuàng)建實(shí)例,代碼如下所示。 上一篇文章介紹了反射的基本概念以及獲取類(lèi)相關(guān)信息的反射API,這一章節(jié)主要記錄如何對(duì)類(lèi)的成員進(jìn)行操作的相關(guān)反射API。 操作類(lèi)成員的類(lèi) 反射API中提供了如下接口,用于對(duì)類(lèi)的成員進(jìn)行操作。 java.lang.reflect.Member 該接口主要有以下三個(gè)實(shí)現(xiàn)類(lèi),用于對(duì)類(lèi)成員中的字段,方法和構(gòu)造器進(jìn)行操作...
摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...
摘要:反射機(jī)制是什么反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為語(yǔ)言的反射機(jī)制反射機(jī)制能做什么反射機(jī)制主要提供了以下功 反射機(jī)制是什么 反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種...
閱讀 3298·2023-04-26 02:09
閱讀 2601·2021-11-24 09:39
閱讀 3291·2021-11-16 11:52
閱讀 3625·2021-10-26 09:50
閱讀 2782·2021-10-08 10:05
閱讀 2465·2021-09-22 15:25
閱讀 3311·2019-08-30 13:14
閱讀 923·2019-08-29 17:06