国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java新手入門:Java反射機制

2019-11-18 15:58:13
字體:
來源:轉載
供稿:網友

摘要
     Reflection 是java被視為動態(或準動態)語言的一個要害性質。這個機制答應程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于運行時改變fields內容或喚起methods。本文借由實例,大面積示范Reflection APIs。
 
關于本文:
讀者基礎:具備Java 語言基礎。
本文適用工具:JDK1.5
 
要害詞:
Introspection(內省、內觀)
Reflection(反射)
 
 
     有時候我們說某個語言具有很強的動態性,有時候我們會區分動態和靜態的不同技術與作法。我們朗朗上口動態綁定(dynamic binding)、動態鏈接(dynamic linking)、動態加載(dynamic loading)等。然而“動 態”一詞其實沒有絕對而普遍適用的嚴格定義,有時候甚至像對象導向當初被導入編程領域一樣,一人一把號,各吹各的調。
 
     一般而言,開發者社群說到動態語言,大致認同的一個定義是:“程序運行時,答應改變程序結構或變量類型,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。
 
    盡管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制:Reflection。這個字的意思是“反射、映象、倒影”,用在Java身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并生成其對象實體、或對其fields設值、或喚起其methods1。這種“看透class”的能力(the ability of the PRogram to examine itself)被稱為introspection(內省、內觀、反省)。Reflection和introspection是常被并提的兩個術語。
 
    Java如何能夠做出上述的動態特性呢?這是一個深遠話題,本文對此只簡單介紹一些概念。整個篇幅最主要還是介紹Reflection APIs,也就是讓讀者知道如何探索class的結構、如何對某個“運行時才獲知名稱的class”生成一份實體、為其fields設值、調用其methods。本文將談到java.lang.Class,以及java.lang.reflect中的Method、Field、ConstrUCtor等等classes。
 
“Class”class
     眾所周知Java有個Object class,是所有Java classes的繼續根源,其內聲明了數個應該在所有Java class中被改寫的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class object。
 
    Class class十分非凡。它和一般classes一樣繼續自Object,其實體用以表達Java程序運行時的classes和interfaces,也用來表達enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及要害詞void。當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class object。假如您想借由“修改Java標準庫源碼”來觀察Class object的實際生成時機(例如在Class的constructor內添加一個println()),不能夠!因為Class并沒有public constructor(見圖1)。本文最后我會撥一小塊篇幅順帶談談Java標準庫源碼的改動辦法。
 
    Class是Reflection故事起源。針對任何您想探勘的class,唯有先為它產生一個Class object,接下來才能經由后者喚起為數十多個的Reflection APIs。這些APIs將在稍后的探險活動中一一亮相。
 
#001 public final
#002 class Class<T> implements java.io.Serializable,
#003 java.lang.reflect.GenericDeclaration,
#004 java.lang.reflect.Type,
#005 java.lang.reflect.AnnotatedElement {
#006     private Class() {}
#007     public String toString() {
#008         return ( isInterface() ? "interface " :
#009         (isPrimitive() ? "" : "class "))
#010     + getName();
#011 }
...
圖1:Class class片段。注重它的private empty ctor,意指不答應任何人經由編程方式產生Class object。是的,其object 只能由JVM 產生。
 
“Class” object的取得途徑
Java答應我們從多種管道為一個class生成對應的Class object。圖2是一份整理。
Class object 誕生管道    示例
運用getClass()
注:每個class 都有此函數    String str = "abc";
Class c1 = str.getClass();
運用
Class.getSuperclass()2    Button b = new Button();
Class c1 = b.getClass();
Class c2 = c1.getSuperclass();
運用static method
Class.forName()
(最常被使用)    Class c1 = Class.forName ("java.lang.String");
Class c2 = Class.forName ("java.awt.Button");
Class c3 = Class.forName ("java.util.LinkedList$Entry");
Class c4 = Class.forName ("I");
Class c5 = Class.forName ("[I");
運用
.class 語法    Class c1 = String.class;
Class c2 = java.awt.Button.class;
Class c3 = Main.InnerClass.class;
Class c4 = int.class;
Class c5 = int[].class;
運用
primitive wrapper classes
的TYPE 語法
     Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;
圖2:Java 答應多種管道生成Class object。
 




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天柱县| 曲周县| 台东市| 乌拉特中旗| 定结县| 保定市| 普兰店市| 哈巴河县| 呼图壁县| 维西| 道真| 拉萨市| 凤翔县| 和硕县| 咸阳市| 如东县| 股票| 大竹县| 澜沧| 大厂| 济南市| 陆河县| 偏关县| 余姚市| 盱眙县| 正安县| 塔河县| 茶陵县| 民乐县| 谢通门县| 景谷| 卢氏县| 新巴尔虎右旗| 梁河县| 张家界市| 通城县| 康定县| 阿拉尔市| 右玉县| 六安市| 怀远县|