SlideShare a Scribd company logo
Submit Search
Upload
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Report
Share
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
6 likes
•
2,263 views
1
of
50
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
•
6 likes
•
2,263 views
Report
Share
Download Now
Download to read offline
Technology
取得.class檔案資訊 動態生成物件與操作方法 瞭解JDK類別載入器階層 使用ClassLoader實例
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
Java SE 8 技術手冊第 9 章 - Collection與Map by
Java SE 8 技術手冊第 9 章 - Collection與Map
Justin Lin
4.9K views
•
81 slides
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
2.5K views
•
68 slides
Java SE 8 技術手冊第 4 章 - 認識物件 by
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
4.2K views
•
91 slides
Java SE 8 技術手冊第 2 章 - 從JDK到IDE by
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
5.3K views
•
66 slides
資料結構 by
資料結構
Justin Lin
1.8K views
•
62 slides
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
2.1K views
•
100 slides
More Related Content
What's hot
Java SE 7 技術手冊投影片第 12 章 - 通用API by
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
2.2K views
•
126 slides
Java SE 8 技術手冊第 5 章 - 物件封裝 by
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
3.4K views
•
74 slides
Java SE 7 技術手冊投影片第 04 章 - 認識物件 by
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
3.2K views
•
91 slides
反射與類別載入器 by
反射與類別載入器
Justin Lin
562 views
•
70 slides
14. 進階主題 by
14. 進階主題
Justin Lin
406 views
•
86 slides
Java SE 7 技術手冊投影片第 05 章 - 物件封裝 by
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
2.6K views
•
75 slides
What's hot
(20)
Java SE 7 技術手冊投影片第 12 章 - 通用API by Justin Lin
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
•
2.2K views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
Java SE 7 技術手冊投影片第 04 章 - 認識物件 by Justin Lin
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
•
3.2K views
反射與類別載入器 by Justin Lin
反射與類別載入器
Justin Lin
•
562 views
14. 進階主題 by Justin Lin
14. 進階主題
Justin Lin
•
406 views
Java SE 7 技術手冊投影片第 05 章 - 物件封裝 by Justin Lin
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
•
2.6K views
CH17:反射與類別載入器 by Justin Lin
CH17:反射與類別載入器
Justin Lin
•
280 views
進階主題 by Justin Lin
進階主題
Justin Lin
•
715 views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API by Justin Lin
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
深入模組化 by Justin Lin
深入模組化
Justin Lin
•
1K views
認識物件 by Justin Lin
認識物件
Justin Lin
•
1.1K views
Java SE 8 技術手冊第 15 章 - 通用API by Justin Lin
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
•
2.2K views
Java SE 8 技術手冊第 3 章 - 基礎語法 by Justin Lin
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
•
5.3K views
從模組到類別 by Justin Lin
從模組到類別
Justin Lin
•
1.7K views
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出 by Justin Lin
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
•
2.2K views
CH09:Collection與Map by Justin Lin
CH09:Collection與Map
Justin Lin
•
288 views
物件封裝 by Justin Lin
物件封裝
Justin Lin
•
1.1K views
9. 資料結構 by Justin Lin
9. 資料結構
Justin Lin
•
292 views
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型 by Justin Lin
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
•
2.5K views
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註 by Justin Lin
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
•
2.2K views
Viewers also liked
Java SE 8 技術手冊第 12 章 - Lambda by
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
4.4K views
•
100 slides
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註 by
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
2.8K views
•
84 slides
Java SE 8 技術手冊第 16 章 - 整合資料庫 by
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
2.9K views
•
101 slides
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2 by
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
5.6K views
•
66 slides
Java SE 8 技術手冊第 13 章 - 時間與日期 by
Java SE 8 技術手冊第 13 章 - 時間與日期
Justin Lin
3.4K views
•
39 slides
Java SE 8 技術手冊第 11 章 - 執行緒與並行API by
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
3.7K views
•
133 slides
Viewers also liked
(20)
Java SE 8 技術手冊第 12 章 - Lambda by Justin Lin
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
•
4.4K views
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註 by Justin Lin
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
•
2.8K views
Java SE 8 技術手冊第 16 章 - 整合資料庫 by Justin Lin
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
•
2.9K views
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2 by Justin Lin
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
•
5.6K views
Java SE 8 技術手冊第 13 章 - 時間與日期 by Justin Lin
Java SE 8 技術手冊第 13 章 - 時間與日期
Justin Lin
•
3.4K views
Java SE 8 技術手冊第 11 章 - 執行緒與並行API by Justin Lin
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
•
3.7K views
Java SE 8 技術手冊第 7 章 - 介面與多型 by Justin Lin
Java SE 8 技術手冊第 7 章 - 介面與多型
Justin Lin
•
2.7K views
Java SE 8 技術手冊第 10 章 - 輸入輸出 by Justin Lin
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
Java SE 8 技術手冊第 8 章 - 例外處理 by Justin Lin
Java SE 8 技術手冊第 8 章 - 例外處理
Justin Lin
•
3.2K views
Java SE 8 技術手冊第 6 章 - 繼承與多型 by Justin Lin
Java SE 8 技術手冊第 6 章 - 繼承與多型
Justin Lin
•
3.5K views
Java SE 8 技術手冊第 1 章 - Java平台概論 by Justin Lin
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
•
11.6K views
從 REPL 到 IDE by Justin Lin
從 REPL 到 IDE
Justin Lin
•
2.3K views
進階主題 by Justin Lin
進階主題
Justin Lin
•
3K views
3D 之邏輯與美感交會 - OpenSCAD by Justin Lin
3D 之邏輯與美感交會 - OpenSCAD
Justin Lin
•
1.4K views
Java SE 7 技術手冊試讀 - Java 平台概論 by Justin Lin
Java SE 7 技術手冊試讀 - Java 平台概論
Justin Lin
•
5.5K views
JDK8 Functional API by Justin Lin
JDK8 Functional API
Justin Lin
•
18.7K views
淺談 Groovy 與 Gradle by Justin Lin
淺談 Groovy 與 Gradle
Justin Lin
•
8.4K views
Java Web 程式之效能技巧與安全防護 by Justin Lin
Java Web 程式之效能技巧與安全防護
Justin Lin
•
2.6K views
Java 8 與 retrolambda by Justin Lin
Java 8 與 retrolambda
Justin Lin
•
5K views
常用內建模組 by Justin Lin
常用內建模組
Justin Lin
•
1.4K views
Similar to Java SE 8 技術手冊第 17 章 - 反射與類別載入器
[圣思园][Java SE]Reflection by
[圣思园][Java SE]Reflection
ArBing Xie
545 views
•
33 slides
[圣思园][Java SE]Java se lesson 9 by
[圣思园][Java SE]Java se lesson 9
ArBing Xie
183 views
•
1 slide
2011中正資管學術部講座 Java-Object by
2011中正資管學術部講座 Java-Object
Veck Hsiao
476 views
•
21 slides
ClassLoader简析 by
ClassLoader简析
wavefly
836 views
•
16 slides
Java类加载器 by
Java类加载器
Fu Cheng
1K views
•
24 slides
Python面向对象开发基础篇 by
Python面向对象开发基础篇
modou li
1.2K views
•
48 slides
Similar to Java SE 8 技術手冊第 17 章 - 反射與類別載入器
(11)
[圣思园][Java SE]Reflection by ArBing Xie
[圣思园][Java SE]Reflection
ArBing Xie
•
545 views
[圣思园][Java SE]Java se lesson 9 by ArBing Xie
[圣思园][Java SE]Java se lesson 9
ArBing Xie
•
183 views
2011中正資管學術部講座 Java-Object by Veck Hsiao
2011中正資管學術部講座 Java-Object
Veck Hsiao
•
476 views
ClassLoader简析 by wavefly
ClassLoader简析
wavefly
•
836 views
Java类加载器 by Fu Cheng
Java类加载器
Fu Cheng
•
1K views
Python面向对象开发基础篇 by modou li
Python面向对象开发基础篇
modou li
•
1.2K views
2, object oriented programming by ted-xu
2, object oriented programming
ted-xu
•
290 views
Sun java by softwaredesigner
Sun java
softwaredesigner
•
391 views
如何在 Java App 中導入 Scala by javatwo2011
如何在 Java App 中導入 Scala
javatwo2011
•
1.4K views
8. 常用標準API by Justin Lin
8. 常用標準API
Justin Lin
•
573 views
10, inner classes by ted-xu
10, inner classes
ted-xu
•
374 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
10. 資料永續與交換 by Justin Lin
10. 資料永續與交換
Justin Lin
•
156 views
8. open() 與 io 模組 by Justin Lin
8. open() 與 io 模組
Justin Lin
•
245 views
7. 例外處理 by Justin Lin
7. 例外處理
Justin Lin
•
115 views
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
2.
反射與類別載入器 學習目標 • 取得 .class
案資訊檔 • 動態生成物件與操作方法 • 瞭解 JDK 類別載入器階層 • 使用 ClassLoader 實例
3.
Class 與 .class
案檔 • Java 真正需要某個類別時才會載入對應 的 .class 案檔 • java.lang.Class 的實例代表 Java 應用程 式運行時載入的 .class 案檔 • Class 類別沒有公開( public )建構式, 實例是由 JVM 自動產生
4.
Class 與 .class
案檔 • 可以透過 Object 的 getClass() 方法,或 者是透過 .class 常量( Class literal )取得每 個物件對應的 Class 物件 • 如果是基本型態,也可以使用對應的包裹類 別加上 .TYPE 取得 Class 物件 – 如 Integer.TYPE 可取得代表 int 的 Class 物件 – 如果要取得代表 Integer.class 案的檔 Class ,則 必須使用 Integer.class
5.
Class 與 .class
案檔 • 可以操作 Class 物件的公開方法取得類別基 本資訊
6.
Class 與 .class
案檔 • 載入 .class 案的時機檔 – 使用指定類別生成物件時 – 使用 Class.forName() – 使用 java.lang.ClassLoader 實例的 loadClass() • 使用類別宣告參考名稱並不會載入 .class 檔 案
7.
Class 與 .class
案檔
8.
Class 與 .class
案檔 • 編譯時期若使用到相關類別,編譯器會檢查 對應的 .class 案中記載之資訊,以確定是檔 否可完成編譯 • 執行時期使用某類別時,會先檢 是否有對查 應的 Class 物件,如果沒有,會載入對應 的 .class 案並生成對應的檔 Class 實例
9.
Class 與 .class
案檔 • 預設 JVM 只會用一個 Class 實例來代表一 個 .class 案(確切說法是,經由同一類別檔 載入器載入的 .class 案,只會有一個對應檔 的 Class 實例) • 每個類別的實例都會知道自己由 個哪 Class 實例生成。預設使用 getClass() 或 .class 取得的 Class 實例會是同一個物件
10.
使用 Class.forName() • 可以使用
Class.forName() 方法實現動態 載入類別,可用字串指定類別名稱來獲得類 別相關資訊
11.
使用 Class.forName() • Class.forName()
另一版本可以讓指定類 別名稱、載入類別時是否執行靜態區塊與類 別載入器: • 如果使用第一個版本的 Class.forName() 方法,等同於:
12.
使用 Class.forName()
13.
從 Class 獲得資訊 •
取得 Class 物件後,就可以取得與 .class 檔 案中記載的的資訊,像是套件、建構式、方 法成員、資料成員等訊息 – java.lang.Package – java.lang.reflect.Constructor – java.lang.reflect.Method – java.lang.reflect.Field – …
18.
從 Class 建立物件 •
取得 Class 物件之後,利用其 newInstance() 方法建立類別實例
19.
從 Class 建立物件 •
你想採用影片程式庫來播放動畫,然而負責 實作影片程式庫的部門遲遲還沒動工,怎麼 辦 ?呢
20.
從 Class 建立物件 •
可以在 動程式時,透過系統屬性啟 cc.openhome.PlayerImpl 指定
21.
從 Class 建立物件 •
執行 MediaPlayer 若指定了 - Dcc.openhome.PlayerImpl=cc.openhome.Conso lePlayer
22.
從 Class 建立物件 •
若類別定義有多個建構式,也可以指定使用 個建構式生成物件哪 • 假設因為某個原因,必須動態載入 java.util.List 實作類別
23.
從 Class 建立物件 •
陣列的 Class 實例是由 JVM 生成,你並不 知道陣列的建構式為何 • 若要動態生成陣列,必須使用 java.lang.reflect.Array 的 newInstance() 方法
24.
從 Class 建立物件 •
可以使用 Array.set() 方法指定索引設值 ,或是使用 Array.get() 方法指定索引取 值 • 比較 懶的方式,偷 直接當作 Object[] (或 已知的陣列型態)使用
25.
從 Class 建立物件 •
為何要使用 Array.newInstance() 建立 陣列實例? • 回顧一下 9.1.7 中實作過的 ArrayList ,如 果現在為其設計一個 toArray() 方法:
26.
從 Class 建立物件 •
現在有個使用者這麼使用 ArrayList ,會 出拋 java.lang.ClassCastException ,告 訴你不可以將 Object[] 當作 String[] 來 使用
27.
從 Class 建立物件 •
可以如下解決:
28.
操作物件方法與成員 • java.lang.reflect.Method 實例是方 法的代表物件,可以使用
invoke() 方法來 動態呼叫指定的方法
29.
操作物件方法與成員 • 底下會設計一個 BeanUtil
類別,可以指定 Map 物件與類別名稱呼叫 getBean() 方法 ,這個方法會抽取 Map 內容並封裝為指定類 別的實例 – 例如 Map 中收集了學生資料,則以下傳回的就是 Student 實例
31.
操作物件方法與成員 • 想呼叫受保護的( protected
)或私有 ( private )方法
32.
操作物件方法與成員 • 可以使用反射機制存取類別資料成員 ( Field
)
33.
動態代理 • 需要在執行某些方法時進行日誌記錄,你可 能會如下撰寫:
34.
靜態代理 • 在靜態代理實現中,代理物件與被代理物件 必須實現同一介面
35.
靜態代理 • 代理物件同樣也要實現 Hello
介面
36.
靜態代理 • 可以如下使用代理物件:
37.
動態代理 • 使用動態代理機制,可使用一個處理者 ( Handler
)代理多個介面的實作物件
39.
動態代理 • 使用 LoggingHandler
的 bind() 方法來 定被代理物件綁
40.
類別載入器階層架構
41.
類別載入器階層架構 • 如果是 Oracle
的 JDK , Bootstrap Loader 會 搜尋系統參數 sun.boot.class.path 中指定位置 的類別
42.
類別載入器階層架構 • Extended Loader
由 Java 撰寫而成,會搜尋系 統參數 java.ext.dirs 中指定位置的類別
43.
類別載入器階層架構 • System Loader
由 Java 撰寫而成,會搜尋系統 參數 java.class.path 指定位置的類別,也就是 CLASSPATH 路徑 • 使用 java 執行程式時,可以加上 -cp 來覆蓋 原有的 CLASSPATH 設定
44.
類別載入器階層架構 • 在載入類別時,每個類別載入器會先將載入 類別的任務交由給父載入器,如果父載入器 找不到,才由自己載入 – 所以會以
Bootstrap Loader→Extended Loader→System Loader 順序尋找類別 • 如果所有類別載入器都找不到指定類別,就 是 java.lang.NoClassDefFoundError
45.
類別載入器階層架構 • 類別載入器都繼承自抽象類別 java.lang.ClassLoader ,可以由 Class
的 getClassLoader() 取得
46.
類別載入器階層架構 • 如果 Some
可在 CLASSPATH 中載入
47.
類別載入器階層架構 • 如果把 Some.class
案(包括套件資料夾)檔 移至 JRE 目錄的 libextclasses 下
48.
建立 ClassLoader 實例 •
Bootstrap Loader 、 Extended Loader 與 System Loader 在程式 動後,就無法再改變啟 它們的搜尋路徑 • 可以使用 URLClassLoader 來產生新的類 別載入器
49.
建立 ClassLoader 實例 •
由同一類別載入器載入的 .class 案,只會檔 有一個 Class 實例 • 如果同一 .class 案由兩個不同的類別載入檔 器載入,則會有兩份不同的 Class 實例