日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 反射 (Class、ClassLoader、Constructor、Method、Field)

發布時間:2024/9/21 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 反射 (Class、ClassLoader、Constructor、Method、Field) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?反射是Java中一個非常重要、非常強大的機制。曾看到一句話“反射是框架的靈魂”,初學時不懂,等到學完框架之后才慢慢理解其意。

什么是反射?我們先通過幾個類和示例來初步體會一下反射。?

一、ClassLoader類

什么是類加載器??

ClassLoader是一個抽象類,它的實例是類加載器。磁盤上存在的xxx.class文件需要被加載進JVM才能執行。類加載器則是負責加載.class文件的對象,然后在JVM中生成該類的Class對象。每一個Class對象都關聯著定義它的那個類加載器。數組的類加載器與其元素的加載器是同一個,如果元素類型是基本類型,則數組沒有類加載器。

類加載器工作原理

類加載器都有一個與之關聯的父加載器,當加載器需要加載一個文件時,它首先將該任務”委派”給父加載器,如果父加載器無法加載該文件,再自己進行加載。JVM的引導加載器(bootstrap class loader)沒有父加載器,但可作為父加載器。關于類加載器更詳細的分析 點擊這里

二、Class類

什么是Class<T>類?

Class不是我們平常聲明類時所用的關鍵字class,它是一個類,它的對象用來描述一個運行狀態的類或接口。一個xxx.java文件編譯后生成一個xxx.class文件,一個xxx.class文件被JVM加載后生成該類對應的Class對象,該對象包含了該類的所有信息,比如,類中有字段、構造器、方法等信息。一個類有一個對應的Class對象,元素類型相同且長度相同的數組共享一個Class對象,java基本類型包括void也都有各自的Class對象。Class是一個泛型類,如果不加泛型,需要強轉。

如何獲取一個類的Class對象?

Class沒有public構造器,當類被加載時,JVM會通過調用ClassLoader的defineClass方法來自動創建該類的Class對象。

獲取一個類的Class對象有三種方式:

1)類名.class

2)? 該類的對象.getClass()

3)? Class.forName(String 類名) (包名加類名) ?

Class對象有何作用?

下面列出幾個Class類的方法:

1) ? 獲取類加載器:

?getClassLoader()

2)? 獲取Constructor構造器對象:

?getConstructor(Class... parameterType) ? ? ? ? ? ? ? ? ? ? ? ? ? ?   獲取具有指定參數的公共構造器對象

?getConstructors() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?   獲取所有公共構造器對象

?getDeclaredConstructor(Class... parameterType)  ?  ?   獲取具有指定參數的構造器對象

?getDdclaredConstructors() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?   獲取所有構造器對象

3)? 獲取Method對象:

? getMethod(String name,Class...parameterType)      ? 獲取具有指定名稱和參數的公共方法對象

? getMethods() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取所有公共方法對象

? getDeclaredMethod(String name,Class...parameterType) ? ? ? ?? 獲取具有指定名稱和參數的方法對象

? getDeclaredMethods()                  獲取所有的方法對象

4)獲取Field字段對象:

? getField(String name) ? ?                  獲取具有指定名稱的公共字段對象

? getFields()                        獲取具有所有公共字段對象

? getDeclaredField(String name)               獲取具有指定名稱的字段對象

? getDeclaredFields()                   ?? 獲取所有字段對象

?5)獲取Class對象所代表的類的一個對象(非常重要的一個方法)

? Object? newInstance() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 用默認的無參數構造器創建一個對象

(帶Declared的get方法可以獲取任意訪問權限的成員,不帶Declared的只能獲取public成員)

測試Class,更多的測試在其他類的測試中體現。

package cn.edu;public class User {private String username;private int age;public User() {}public User(String username , int age) {this.username = username;this.age = age;}private User(String username) {this.username = username;}
public void say(String str) {
??      System.out.println(str);
    ?}

@Overridepublic String toString() {return "User [username=" + username + ", age=" + age + "]";}}

  

@Testpublic void fun2() throws Exception {Class userClass = User.class;System.out.println(userClass.getName()); //獲取該class對象的類的類名System.out.println(userClass.getClassLoader().toString()); //獲取類加載器User user = (User)userClass.newInstance(); //調用默認的無參數構造器創建對象System.out.println(user.toString());}

  運行結果:

?

三、Constructor類

構造器類,封裝構造器的有關信息。

主要方法 Object newInstance(Object...arg) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 用指定參數創建對象

測試Constructor

@Testpublic void fun2() throws Exception {Class userClass = User.class;Constructor userConstructor1 = userClass.getConstructor(String.class , int.class); //有參構造器User user1 = (User)userConstructor1.newInstance("小紅",18);System.out.println(user1.toString());Constructor userConstructor2 = userClass.getConstructor(); //無參構造器User user2 = (User)userConstructor2.newInstance();System.out.println(user2);Constructor userConstructor3 = userClass.getDeclaredConstructor(String.class); //私有構造器userConstructor3.setAccessible(true); //開啟訪問權限User user3 = (User)userConstructor3.newInstance("小明");System.out.println(user3);}

  運行結果:

默認是不可以訪問private成員的,userConstructor3.setAccessible(true)是用于開啟訪問權限的,這樣就可以訪問了,感覺是開掛一樣!

?

四、Method類?

方法類,封裝方法的有關信息

主要方法

Object invoke(Object obj , Object... args) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 調用obj對象的Method對象代表的方法,args為參數

測試Method:

?

@Testpublic void fun2() throws Exception {Class userClass = User.class; User user = (User)userClass.newInstance(); //用默認無參數構造方法創建對象Method method = userClass.getMethod("say",String.class); //獲取名為"say",參數為string的method對象method.invoke(user,"hello"); //調用user的say方法}

  運行結果:

?

五、Field類

字段類,封裝字段的有關信息

主要方法

Object get(Object obj) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取obj對象的此Field對象代表的字段的值

void set(Object obj , Object value)              設置obj對象的此Field對象代表的字段的值

?測試Fidle

@Testpublic void fun2() throws Exception {Class userClass = User.class;Constructor userConstructor = userClass.getConstructor(String.class,int.class);User user = (User)userConstructor.newInstance("小明",18); System.out.println(user.toString());Field userField = userClass.getDeclaredField("username"); //獲取username字段userField.setAccessible(true); //開啟訪問權限userField.set(user, "小紅"); //給user對象的該字段設置值System.out.println(user.toString());}

   運行結果:

?

?

  到此關于反射的幾個類就簡單的認識了一下,我們可以不用new關鍵字來創建對象,調用對象的方法也與傳統的調用方式有很大區別,我們甚至可以操作private成員(雖然這樣做破壞了封裝性),相對于傳統的操作方式,反射更像是一種逆向思維,以前操作成員,主體在于對象,而反射的主體在于Class和成員本身。到此我們對反射有了初步的認識。接下在敘述一個重要的概念,有助于我們更好的理解反射。

六、動態加載與靜態加載

注意此處所說的加載是針對編譯的,將xxx.java轉化成xxx.class,而不是運行的加載字節碼。Java創建對象的常用方式是使用new 關鍵字,如 User user? = new User(); 這種是靜態加載,即在編譯期就已經獲取User類的有關信息,如果User類不存在或有錯誤,編譯會報錯。動態加載就是用上面的Class.forName("包名.User");來加載User類,如果User類不存在或是有錯誤,在編譯時是不會報錯的,因為根本沒去加載User類。只有當程序運行到該處,JVM才會去加載User,而動態加載則是依賴反射實現的。

?

好了,可以給出最終概念了,通過上面的重重示例與解析,應該不難理解反射了。

七、反射  

  Java反射機制是指java程序在運行過程中,可以獲取任意一個類的相關信息,并且能夠調用其方法和屬性,這種動態獲取信息和動態調用方法的功能叫做Java的反射機制。

? ? ? 上面寫了這么多,總結起來也就這一句話。

?

 本文個人編寫,水平有限,如有錯誤,懇請指出,歡迎討論分享。

?

轉載于:https://www.cnblogs.com/wanghang-learning/p/9142750.html

總結

以上是生活随笔為你收集整理的Java 反射 (Class、ClassLoader、Constructor、Method、Field)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内精品视频一区 | 四虎精品一区 | 在哪里看毛片 | 探花视频在线版播放免费观看 | 中文字幕乱码人妻无码久久 | 狼性av懂色av禁果av | 在线视频欧美日韩 | 日韩成人福利 | 久久伊人五月天 | 黄色网久久 | 国产精品理论在线观看 | 波多野结衣一区二区三区中文字幕 | 女人脱了内裤趴开腿让男躁 | 99黄色片| 久久久久久久久久免费视频 | 久久久久人妻一区精品色欧美 | 精品在线观看免费 | 中出在线视频 | 伊人久久影视 | 天天干,夜夜操 | 搞中出 | 少妇高潮一区二区三区99刮毛 | 国产又粗又长又大视频 | 天天天天操 | 人妖粗暴刺激videos呻吟 | 亚洲欧美综合 | 中文人妻一区二区三区 | 日本黄色录象 | 香蕉手机网 | 久久国产精品无码一区二区 | 久久96视频| 成av人在线 | 91成人免费电影 | 粗大的内捧猛烈进出在线视频 | 视频在线观看一区二区 | 黄色小视频免费观看 | 成人av动漫在线观看 | 亚洲黄片一区二区三区 | 免费荫蒂添的好舒服视频 | 丝袜ol美脚秘书在线播放 | 黄色网入口 | 久久免费福利 | 性高潮视频在线观看 | 久久美利坚 | 日韩成人黄色 | 国产一区二区不卡视频 | 欧美天天视频 | 黄色激情av | 国产又爽又黄免费软件 | 老熟妇高潮一区二区高清视频 | 久福利| 国产一区二区三区成人 | 亚洲wwww| 日本少妇性高潮 | 男人操女人免费视频 | 一二三不卡视频 | 粉嫩av国产一区二区三区 | 亚洲精品视频在线观看视频 | 久久密桃 | 亚洲综合在线视频 | 亚洲自拍激情 | 日本吃奶摸下激烈网站动漫 | 夜夜爽爽 | 国产精品theporn动漫 | 人妻换人妻仑乱 | www.久久成人| 老熟妇仑乱一区二区av | 特黄aaaaaaa片免费视频 | 97xxxxx| 艳情五月 | 国产区在线观看 | 亚洲网站免费 | 亚洲色图校园春色 | 亚洲图片小说区 | 日韩欧美一区二区三区四区五区 | 激情综合一区二区三区 | 婷婷国产 | 国产最新自拍视频 | 日韩人妻无码精品综合区 | 五月婷婷综合网 | 亚洲精品喷潮一区二区三区 | 在线中文字幕网站 | 一级片在线视频 | 人妻互换一二三区激情视频 | 又黄又爽的视频在线观看 | 亚洲综合日韩 | 顶级毛片| 午夜视频久久 | 日韩簧片在线观看 | 丝袜综合网 | 国内视频一区二区 | 国产高潮久久 | www色中色 | 美女色综合 | 在线观看欧美一区二区 | 日本成人在线看 | 免费网站在线观看人数在哪动漫 | 日本大尺度激情做爰hd | 伊人资源 |