SlideShare a Scribd company logo
Submit Search
Upload
反射與類別載入器
Report
Share
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
1 like
•
562 views
1
of
70
反射與類別載入器
•
1 like
•
562 views
Report
Share
Download Now
Download to read offline
Technology
取得.class檔案資訊 動態生成物件與操作方法 認識模組與反射的權限設定 瞭解JDK9類別載入器階層 使用ClassLoader實例
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
進階主題 by
進階主題
Justin Lin
715 views
•
77 slides
認識物件 by
認識物件
Justin Lin
1.1K views
•
97 slides
物件封裝 by
物件封裝
Justin Lin
1.1K views
•
74 slides
14. 進階主題 by
14. 進階主題
Justin Lin
406 views
•
86 slides
CH17:反射與類別載入器 by
CH17:反射與類別載入器
Justin Lin
280 views
•
65 slides
深入模組化 by
深入模組化
Justin Lin
1K views
•
27 slides
More Related Content
What's hot
Java SE 8 技術手冊第 17 章 - 反射與類別載入器 by
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
2.3K views
•
50 slides
CH19:深入模組化 by
CH19:深入模組化
Justin Lin
791 views
•
27 slides
9. 資料結構 by
9. 資料結構
Justin Lin
292 views
•
73 slides
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
2.5K views
•
68 slides
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器 by
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
1.9K views
•
48 slides
CH16:整合資料庫 by
CH16:整合資料庫
Justin Lin
359 views
•
107 slides
What's hot
(20)
Java SE 8 技術手冊第 17 章 - 反射與類別載入器 by Justin Lin
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
•
2.3K views
CH19:深入模組化 by Justin Lin
CH19:深入模組化
Justin Lin
•
791 views
9. 資料結構 by Justin Lin
9. 資料結構
Justin Lin
•
292 views
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by Justin Lin
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
•
2.5K views
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器 by Justin Lin
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
•
1.9K views
CH16:整合資料庫 by Justin Lin
CH16:整合資料庫
Justin Lin
•
359 views
[圣思园][Java SE]Reflection by ArBing Xie
[圣思园][Java SE]Reflection
ArBing Xie
•
545 views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API by Justin Lin
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
資料永續與交換 by Justin Lin
資料永續與交換
Justin Lin
•
519 views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by Justin Lin
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
•
2.1K views
5. 建構式、原型與類別 by Justin Lin
5. 建構式、原型與類別
Justin Lin
•
205 views
CH09:Collection與Map by Justin Lin
CH09:Collection與Map
Justin Lin
•
288 views
Java SE 7 技術手冊投影片第 04 章 - 認識物件 by Justin Lin
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
•
3.2K views
CH04:認識物件 by Justin Lin
CH04:認識物件
Justin Lin
•
421 views
10. 資料永續與交換 by Justin Lin
10. 資料永續與交換
Justin Lin
•
156 views
進階主題 by Justin Lin
進階主題
Justin Lin
•
3K views
Java SE 7 技術手冊投影片第 12 章 - 通用API by Justin Lin
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
•
2.2K views
10, inner classes by ted-xu
10, inner classes
ted-xu
•
374 views
從模組到類別 by Justin Lin
從模組到類別
Justin Lin
•
1.7K views
Similar to 反射與類別載入器
Java类加载器 by
Java类加载器
Fu Cheng
1K views
•
24 slides
Jdk5 by
Jdk5
Medivh2011
226 views
•
30 slides
Reflection by
Reflection
Medivh2011
233 views
•
33 slides
2, object oriented programming by
2, object oriented programming
ted-xu
290 views
•
31 slides
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE by
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
3.6K views
•
66 slides
如何在 Java App 中導入 Scala by
如何在 Java App 中導入 Scala
javatwo2011
1.4K views
•
82 slides
Similar to 反射與類別載入器
(11)
Java类加载器 by Fu Cheng
Java类加载器
Fu Cheng
•
1K views
Jdk5 by Medivh2011
Jdk5
Medivh2011
•
226 views
Reflection by Medivh2011
Reflection
Medivh2011
•
233 views
2, object oriented programming by ted-xu
2, object oriented programming
ted-xu
•
290 views
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE by Justin Lin
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
•
3.6K views
如何在 Java App 中導入 Scala by javatwo2011
如何在 Java App 中導入 Scala
javatwo2011
•
1.4K views
ClassLoader简析 by wavefly
ClassLoader简析
wavefly
•
836 views
Java SE 7 技術手冊投影片第 01 章 - Java平台概論 by Justin Lin
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Justin Lin
•
5.9K views
Python面向对象开发基础篇 by modou li
Python面向对象开发基础篇
modou li
•
1.2K views
CH02:從JDK到IDE by Justin Lin
CH02:從JDK到IDE
Justin Lin
•
481 views
Java Tutorial:Learn Java in 06:00:00 by Justin Lin
Java Tutorial:Learn Java in 06:00:00
Justin Lin
•
27.5K views
More from Justin Lin
Ch14 簡介 Spring Boot by
Ch14 簡介 Spring Boot
Justin Lin
872 views
•
22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/Security
Justin Lin
280 views
•
58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走
Justin Lin
274 views
•
31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMail
Justin Lin
157 views
•
8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理
Justin Lin
153 views
•
30 slides
Ch09 整合資料庫 by
Ch09 整合資料庫
Justin Lin
233 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
•
872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/Security
Justin Lin
•
280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走
Justin Lin
•
274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMail
Justin Lin
•
157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理
Justin Lin
•
153 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫
Justin Lin
•
233 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤
Justin Lin
•
133 views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTL
Justin Lin
•
161 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSP
Justin Lin
•
250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理
Justin Lin
•
238 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應
Justin Lin
•
236 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 Servlet
Justin Lin
•
352 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式
Justin Lin
•
1.2K views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步
Justin Lin
•
237 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能
Justin Lin
•
153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組
Justin Lin
•
149 views
8. open() 與 io 模組 by Justin Lin
8. open() 與 io 模組
Justin Lin
•
245 views
7. 例外處理 by Justin Lin
7. 例外處理
Justin Lin
•
115 views
6. 類別的繼承 by Justin Lin
6. 類別的繼承
Justin Lin
•
166 views
Recently uploaded
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan
151 views
•
54 slides
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
40 views
•
37 slides
Hacking Facebook for fun and profit by Pranav Hivarekar by
Hacking Facebook for fun and profit by Pranav Hivarekar
Pranav Hivarekar
6 views
•
69 slides
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
43 views
•
25 slides
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
43 views
•
32 slides
AI Technology & Development of Civilization by
AI Technology & Development of Civilization
unclebrown017
44 views
•
74 slides
Recently uploaded
(6)
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by Shengyou Fan
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan
•
151 views
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
•
40 views
Hacking Facebook for fun and profit by Pranav Hivarekar by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav Hivarekar
Pranav Hivarekar
•
6 views
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
•
43 views
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
•
43 views
AI Technology & Development of Civilization by unclebrown017
AI Technology & Development of Civilization
unclebrown017
•
44 views
反射與類別載入器
1.
1
2.
反射與類別載入器 學習目標 • 取得.class檔案資訊 • 動態生成物件與操作方法 •
認識模組與反射的權限設定 • 瞭解JDK9類別載入器階層 • 使用ClassLoader實例 2
3.
運用反射 • JDK9支援模組化 • 開發者在採取模組設計時,如何在不破壞模 組封裝下又能運用反射機制的彈性,就成了 認識反射時必須知道的一大課題 3
4.
Class與.class檔案 • Java真正需要某個類別時才會載入對應 的.class檔案 • java.lang.Class的實例代表Java應用程 式運行時載入的.class檔案 •
Class類別沒有公開(public)建構式, 實例是由JVM自動產生 4
5.
Class與.class檔案 • 可以透過Object的getClass()方法,或 者是透過.class常量(Class literal)取得每個 物件對應的Class物件 •
如果是基本型態,也可以使用對應的包裹類 別加上.TYPE取得Class物件 – 如Integer.TYPE可取得代表int的Class物件 – 如果要取得代表Integer.class檔案的Class,則必 須使用Integer.class 5
6.
Class與.class檔案 • 可以操作Class物件的公開方法取得類別基 本資訊 6
7.
Class與.class檔案 • 載入.class檔案的時機 – 使用指定類別生成物件時 –
使用 Class.forName() – 使用java.lang.ClassLoader實例的 loadClass() • 使用類別宣告參考名稱並不會載入.class檔案 7
8.
Class與.class檔案 8
9.
Class與.class檔案 • 編譯時期若使用到相關類別,編譯器會檢查 對應的.class檔案中記載之資訊,以確定是否 可完成編譯 • 執行時期使用某類別時,會先檢查是否有對 應的
Class物件,如果沒有,會載入對應 的.class檔案並生成對應的Class實例 9
10.
Class與.class檔案 • 預設JVM只會用一個Class實例來代表一 個.class檔案(確切說法是,經由同一類別載 入器載入的.class檔案,只會有一個對應的 Class實例) • 每個類別的實例都會知道自己由哪個Class實 例生成。預設使用getClass()或.class取得 的Class實例會是同一個物件 10
11.
使用Class.forName() • 可以使用Class.forName()方法實現動態 載入類別,可用字串指定類別名稱來獲得類 別相關資訊 11
12.
使用Class.forName() • Class.forName()另一版本可以讓指定類 別名稱、載入類別時是否執行靜態區塊與類 別載入器: • 如果使用第一個版本的Class.forName() 方法,等同於: 12
13.
使用Class.forName() 13
14.
從Class獲得資訊 • 取得Class物件後,就可以取得與.class檔案 中記載的的資訊,像是套件、建構式、方法 成員、資料成員等訊息 – java.lang.Package –
java.lang.reflect.Constructor – java.lang.reflect.Method – java.lang.reflect.Field – … 14
15.
15
16.
16
17.
17
18.
18
19.
從Class建立物件 • 取得Class物件之後 • 呼叫Class的getConstructor()或 getDeclaredConstructor()方法 •
取得代表建構式的Constructor物件,利 用其newInstance()方法建立類別實例 19
20.
從Class建立物件 • 你想採用影片程式庫來播放動畫,然而負責 實作影片程式庫的部門遲遲還沒動工,怎麼 辦呢? 20
21.
從Class建立物件 • 可以在啟動程式時,透過系統屬性 cc.openhome.PlayerImpl指定 21
22.
從Class建立物件 • 執行MediaPlayer若指定了- Dcc.openhome.PlayerImpl=cc.openhome.Conso lePlayer 22
23.
從Class建立物件 • 若類別定義有多個建構式,也可以指定使用 哪個建構式生成物件 • 假設因為某個原因,必須動態載入 java.util.List實作類別 23
24.
從Class建立物件 • 陣列的Class實例是由JVM生成,你並不知 道陣列的建構式為何 • 若要動態生成陣列,必須使用 java.lang.reflect.Array的 newInstance()方法 24
25.
從Class建立物件 • 可以使用Array.set()方法指定索引設值, 或是使用Array.get()方法指定索引取值 • 比較偷懶的方式,直接當作Object[](或 已知的陣列型態)使用 25
26.
從Class建立物件 • 為何要使用Array.newInstance()建立陣 列實例? • 回顧一下9.1.7中實作過的ArrayList,如果 現在為其設計一個toArray()方法: 26
27.
從Class建立物件 • 現在有個使用者這麼使用ArrayList,會拋 出java.lang.ClassCastException, 告訴你不可以將Object[]當作String[] 來使用 27
28.
從Class建立物件 • 可以如下解決: 28
29.
操作物件方法與成員 • java.lang.reflect.Method實例是方法 的代表物件,可以使用invoke()方法來動 態呼叫指定的方法 29
30.
操作物件方法與成員 • 底下會設計一個BeanUtil類別,可以指定 Map物件與類別名稱呼叫getBean()方法, 這個方法會抽取Map內容並封裝為指定類別 的實例 – 例如Map中收集了學生資料,則以下傳回的就是 Student實例 30
31.
31
32.
操作物件方法與成員 • 想呼叫受保護的(protected)或私有 (private)方法 32
33.
操作物件方法與成員 • 可以使用反射機制存取類別資料成員(Field) 33
34.
操作物件方法與成員 • setAccessible(true)時,如果模組權限 設定上不允許,會拋出 java.lang.reflect.InaccessibleOb jectException • 就目前來說,上面的程式片段中 setAccessible(true)可以用於同一模組 的類別,然而不能用於java.base中的類別 •
因為java.base模組並沒有開放權限 34
35.
動態代理 • 需要在執行某些方法時進行日誌記錄,你可 能會如下撰寫: 35
36.
靜態代理 • 在靜態代理實現中,代理物件與被代理物件 必須實現同一介面 36
37.
靜態代理 • 代理物件同樣也要實現Hello介面 37
38.
靜態代理 • 可以如下使用代理物件: 38
39.
動態代理 • 使用動態代理機制,可使用一個處理者 (Handler)代理多個介面的實作物件 39
40.
40
41.
動態代理 • 使用LoggingHandler的bind()方法來綁 定被代理物件 41
42.
當反射遇上模組 • 對於JDK8以及先前版本的JDK,就算開發者 不願意,只要程式庫的使用者運用反射,就 可以訪問類別定義的成員 • 這包括了公開、受保護與私有成員,事實上 ,在Java的生態圈中 •
有不少程式庫或框架,都依賴在這種深層反 射(Deep reflection)機制上運作 42
43.
當反射遇上模組 • JDK9的模組是為了強封裝,若反射機制依舊 可以這般自由,那麼模組就失去了強封裝的 意義 • 然而,也必須考慮現存程式庫或框架依賴於 深層反射的現況,否則這些程式庫或框架將 不會考慮遷移至JDK9 43
44.
當反射遇上模組 • 模組的設計者可以決定是否允許反射 • 範例檔labsCH17ReflectModule 44
45.
45
46.
模組圖 • 一個模組在模組路徑之中,只是表示JVM可 以找到模組描述檔(module-info.class) • 不代表模組圖(Module
graph)中有這個模 組,模組圖中不存在的模組,自然就找不到 模組中的類別 46
47.
• 要將模組加入模組圖的方式之一,是在執行 java指令啟動JVM時,使用--add- modules引數加入其他模組作為根模組 • 如果執行java指令指定了--add-modules cc.openhome.reflect 47
48.
• 另一個將指定模組加入模組圖方式是,在模 組描述檔中加入requires設定 • 現有模組會依賴在requires的模組之上 •
現有模組可以讀取(read)該模組,或稱現 在模組對該模組有讀取能力(Readability) 48
49.
49
50.
50
51.
exports套件 • 若模組能允許其他模組對指定的公開成員進 行操作,必須在模組描述檔使用exports定義 哪些套件中的類別是可以允許此動作 • 更確切的說法是,指定此模組中哪些套件中 的公開成員可以存取(Accessibility) 51
52.
52
53.
53
54.
54
55.
55
56.
opens套件或open模組 • 若模組能允許其他模組在反射時,對指定的 非公開成員進行操作,必須在模組描述檔使 用opens定義哪些套件中的類別是可以允許 此動作 56
57.
• 除了使用opens指定要開放的套件之外,也 可以使用 open
module,表示開放這個模 組中全部的套件 • 如果使用了open module,那麼module中 的定義就不能再有opens的獨立設定 • 被設定為open module的模組被稱為開放 模組(Open Module) • 沒有open的模組稱為一般模組(Normal module),它們都屬於顯式模組。 57
58.
• java.base模組中的套件使用了exports • 沒有設定opens的套件,也沒有直接open module
java.base • 若採取模組化設計,就不允許其他模組在反 射時,對指定的非公開成員進行操作 58
59.
使用ServiceLoader • 如果Player是種API服務,更實際的場景會 是,Player會是服務的介面之一,它也許是 定義在cc.openhome.api套件之中 • ConsolePlayer是服務的具體實現,可能 定義在cc.openhome.impl套件之中 •
MediaMaster是你正在設計的應用程式, 定義在cc.openhome套件之中 • 拆成三個模組 59
60.
使用ServiceLoader 60
61.
61
62.
62
63.
• java.sql模組的module-info.java定義 63
64.
JDK9類別載入器階層 • 在JDK9中,有三種層次的類別載入器負責載 入類別 – System類別載入器(也稱為Application載入器) –
Platform類別載入器 – Bootstrap類別載入器 64
65.
JDK9類別載入器階層 • System的父載入器為Platform,而Platform 的父載入器為Bootstrap 65
66.
• System類別載入器可以載入應用程式模組路 徑、類別路徑上的類別 • Platform載入器可以載入整個Java
SE 平臺 API、實作類別 • Bootstrap類別載入器是JVM內建的載入器 66
67.
67
68.
建立ClassLoader實例 • Bootstrap Loader、Platform
Loader與System Loader在程式啟動後,就無法再改變它們的 搜尋路徑 • 可以使用URLClassLoader來產生新的類別 載入器 68
69.
建立ClassLoader實例 • 由同一類別載入器載入的.class檔案,只會有 一個Class實例 • 如果同一.class檔案由兩個不同的類別載入器 載入,則會有兩份不同的Class實例 69
70.
70