反射與類別載入器 學習目標 取得.class檔案資訊 動態生成物件與操作方法 瞭解JDK類別載入器階層 使用ClassLoader實例.

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Java 大学实用教程 ( 第 3 版 ) 主讲:程继洪 第 1 章 Java 语言概述  本章导读 Java 语言的诞生Java 语言的诞生 学习 Java 的必要性 学习 Java 的必要性 Java 的特点及与 C/C++ 之关系Java 的特点及与 C/C++ 之关系.
第 2 章 Java 运行环境搭建 2.1 Java 的运行系统 2.1 Java 的运行系统 2.2 JDK 的安装与配置2.2 JDK 的安装与配置 2.3 Java 开发工具包 2.4 Java 源文件编辑环境的选择 2.5 Application 和 Applet 程序的编写与运行.
Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
第 9 章 测试部署  9.1 测试  9.2 部署. 9.1 测试  应用测试:使用 JUnit 单元测试框架 测试的目的是检验开发结果是否满足规定需求,测试是保证软件质量的一个重要手段, 在软件开发过程中是不可缺少的组成部分。 单元测试与集成测试分别有各自的定义:在实际开发中,两者之间的界定是模糊的。
第一章 Java 程序设计技术 概述  什么是 Java 语言  一个简单的 Java 程序  程序的编译和运行  常见错误  使用 Java 核心 API 文档.
程序设计语言基础 软件工程系 秦晓燕. 课程目标 了解面向对象程序设计的思想,以及软件 开发流程。 学习 Java 语言的基本概念和编程方法,基 本掌握 Java 类库的使用。 能够利用所学的方法开发简单的小型应用 程序.
Java 程序设计(第二版) 普通高等教育 “ 十一五 ” 国家级规划教材 辛运帷等 编著 徐小平 主讲.
第16章 代理模式 Website:
《 Java开发环境配置》 主讲人:耿力.
C语言程序设计 李伟光.
教學經驗分享 吳毅成 國立交通大學資訊工程系 2012年4月.
Java程序设计教程 第一讲 Java概述.
  中国技术交易信息服务平台 中国技术市场管理促进中心.
Java的程式架構與基本觀念 Java語言的歷史 Java程式的開發環境 Java程式的架構 輸出與輸入物件之使用 工具使用方法介紹
第九章日治時期的台灣(下).
JAVA程序设计.
面向对象程序设计(Java) 徐志红
计算机学院计算机科学与技术系 中德联合软件技术研究所 李波
贴近教学 服务师生 方便老师.
第一章 面向对象程序设计.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
程設一.
類別與物件 Class & Object.
程設一.
第六章 类的扩展与继承.
Ch13 集合與泛型 物件導向程式設計(2).
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
JAVA程序设计 第5章 深入理解JAVA语言----补充.
程式設計實作.
CH09 套件 物件導向程式設計(II).
Java软件设计基础 5. 继承与多态.
职责链模式.
IEEM 5352 Enterprise Integration
第9章 類別圖與物件圖 9-1 類別圖與物件圖的基礎 9-2 類別圖的符號 9-3 類別關係 9-4 物件圖 9-5 繪製類別圖與物件圖
Java程序设计 第9章 继承和多态.
2018/12/7 Java语言程序设计 教师:段鹏飞.
Java基础入门 第1章 Java开发入门 · Java语言的特点 · Java开发环境的搭建 · 环境变量的配置 · Java的运行机制.
辅导课程十三.
SPOTO TM JAVA课程 JAVA中的OO语法
辅导课程九.
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
二:JAVA开发环境的安装和配置.
Java lab3.
認識 Java.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第11章 系统结构与包模型模型.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
面向对象 程序设计语言基础 马骏
JAVA 编 程 技 术 主编 贾振华 2010年1月.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
中華大學 資訊工程學系 報告人:資訊工程學系 許慶賢 系主任.
C#程序设计基础 $3 成员、变量和常量.
課程網站
第7章 异常处理.
C++复习2----类与对象.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第三章 世界文明的蛻變與互動 第一節 歐洲社會的蛻變 第二節 世界文明的交匯 第三節 亞洲大帝國的發展 1.
Review 1~3.
第八节 算术运算符和算术表达式.
辅导课程十一.
Scala编程
方格紙上畫正方形.
OSGi: 服務導向的Java模組系統 廖峻鋒 (try) 台大資工所 智慧型機器人及自動化實驗室.
JAVA 程式設計與資料結構 第三章 物件的設計.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

反射與類別載入器 學習目標 取得.class檔案資訊 動態生成物件與操作方法 瞭解JDK類別載入器階層 使用ClassLoader實例

Class與.class檔案 Java真正需要某個類別時才會載入對應的.class檔案 java.lang.Class的實例代表Java應用程式運行時載入的.class檔案 Class類別沒有公開(public)建構式,實例是由JVM自動產生

Class與.class檔案 可以透過Object的getClass()方法,或者是透過.class常量(Class literal)取得每個物件對應的Class物件 如果是基本型態,也可以使用對應的包裹類別加上.TYPE取得Class物件 如Integer.TYPE可取得代表int的Class物件 如果要取得代表Integer.class檔案的Class,則必須使用Integer.class

Class與.class檔案 可以操作Class物件的公開方法取得類別基本資訊

Class與.class檔案 載入.class檔案的時機 使用類別宣告參考名稱並不會載入.class檔案 使用指定類別生成物件時 使用 Class.forName() 使用java.lang.ClassLoader實例的loadClass() 使用類別宣告參考名稱並不會載入.class檔案

Class與.class檔案

Class與.class檔案 編譯時期若使用到相關類別,編譯器會檢查對應的.class檔案中記載之資訊,以確定是否可完成編譯

Class與.class檔案 預設JVM只會用一個Class實例來代表一個.class檔案(確切說法是,經由同一類別載入器載入的.class檔案,只會有一個對應的Class實例) 每個類別的實例都會知道自己由哪個Class實例生成。預設使用getClass()或.class取得的Class實例會是同一個物件

使用Class.forName() 可以使用Class.forName()方法實現動態載入類別,可用字串指定類別名稱來獲得類別相關資訊

使用Class.forName() Class.forName()另一版本可以讓指定類別名稱、載入類別時是否執行靜態區塊與類別載入器:

使用Class.forName()

從Class獲得資訊 取得Class物件後,就可以取得與.class檔案中記載的的資訊,像是套件、建構式、方法成員、資料成員等訊息 java.lang.Package java.lang.reflect.Constructor java.lang.reflect.Method java.lang.reflect.Field …

從Class建立物件 取得Class物件之後,利用其newInstance()方法建立類別實例

從Class建立物件 你想採用影片程式庫來播放動畫,然而負責實作影片程式庫的部門遲遲還沒動工,怎麼辦呢?

從Class建立物件 可以在啟動程式時,透過系統屬性cc.openhome.PlayerImpl指定

從Class建立物件 執行MediaPlayer若指定了-Dcc.openhome.PlayerImpl=cc.openhome.ConsolePlayer

從Class建立物件 若類別定義有多個建構式,也可以指定使用哪個建構式生成物件 假設因為某個原因,必須動態載入java.util.List實作類別

從Class建立物件 陣列的Class實例是由JVM生成,你並不知道陣列的建構式為何 若要動態生成陣列,必須使用java.lang.reflect.Array的newInstance()方法

從Class建立物件 可以使用Array.set()方法指定索引設值,或是使用Array.get()方法指定索引取值 比較偷懶的方式,直接當作Object[](或已知的陣列型態)使用

從Class建立物件 為何要使用Array.newInstance()建立陣列實例? 回顧一下9.1.7中實作過的ArrayList,如果現在為其設計一個toArray()方法:

從Class建立物件 現在有個使用者這麼使用ArrayList,會拋出java.lang.ClassCastException,告訴你不可以將Object[]當作String[]來使用

從Class建立物件 可以如下解決:

操作物件方法與成員 java.lang.reflect.Method實例是方法的代表物件,可以使用invoke()方法來動態呼叫指定的方法

操作物件方法與成員 底下會設計一個BeanUtil類別,可以指定Map物件與類別名稱呼叫getBean()方法,這個方法會抽取Map內容並封裝為指定類別的實例 例如Map中收集了學生資料,則以下傳回的就是Student實例

操作物件方法與成員 想呼叫受保護的(protected)或私有(private)方法

操作物件方法與成員 可以使用反射機制存取類別資料成員(Field)

動態代理 需要在執行某些方法時進行日誌記錄,你可能會如下撰寫:

靜態代理 在靜態代理實現中,代理物件與被代理物件必須實現同一介面

靜態代理 代理物件同樣也要實現Hello介面

靜態代理 可以如下使用代理物件:

動態代理 使用動態代理機制,可使用一個處理者(Handler)代理多個介面的實作物件

動態代理 使用LoggingHandler的bind()方法來綁定被代理物件

類別載入器階層架構

類別載入器階層架構 如果是Oracle的JDK,Bootstrap Loader會搜尋系統參數sun.boot.class.path中指定位置的類別

類別載入器階層架構 Extended Loader由Java撰寫而成,會搜尋系統參數java.ext.dirs中指定位置的類別

類別載入器階層架構 System Loader由Java撰寫而成,會搜尋系統參數java.class.path指定位置的類別,也就是CLASSPATH路徑 使用java執行程式時,可以加上-cp來覆蓋原有的CLASSPATH設定

類別載入器階層架構 在載入類別時,每個類別載入器會先將載入類別的任務交由給父載入器,如果父載入器找不到,才由自己載入 所以會以Bootstrap Loader→Extended Loader→System Loader順序尋找類別 如果所有類別載入器都找不到指定類別,就是java.lang.NoClassDefFoundError

類別載入器階層架構 類別載入器都繼承自抽象類別java.lang.ClassLoader,可以由Class的 getClassLoader()取得

類別載入器階層架構 如果Some可在CLASSPATH中載入

類別載入器階層架構 如果把Some.class檔案(包括套件資料夾)移至JRE目錄的lib\ext\classes下

建立ClassLoader實例 Bootstrap Loader、Extended Loader與System Loader在程式啟動後,就無法再改變它們的搜尋路徑 可以使用URLClassLoader來產生新的類別載入器

建立ClassLoader實例 由同一類別載入器載入的.class檔案,只會有一個Class實例