亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

候捷談Java反射機制

系統 2549 0

有時候我們說某個語言具有很強的動態性,有時候我們會區分動態和靜態的不同技術與作法。我們朗朗上口動態綁定( dynamic binding )、動態鏈接( dynamic linking )、動態加載( dynamic loading )等。然而 動態 一詞其實沒有絕對而普遍適用的嚴格定義,有時候甚至像對象導向當初被導入編程領域一樣,一人一把號,各吹各的調。

?

一般而言,開發者社群說到動態語言,大致認同的一個定義是: 程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言 。從這個觀點看, Perl Python Ruby 是動態語言, C++ Java C# 不是動態語言。

?

盡管在這樣的定義與分類下 Java 不是動態語言,它卻有著一個非常突出的動態相關機制: Reflection 。這個字的意思是 反射、映象、倒影 ,用在 Java 身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的 classes 。換句話說, Java 程序可以加載一個運行時才得知名稱的 class ,獲悉其完整構造(但不包括 methods 定義),并生成其對象實體、或對其 fields 設值、或喚起其 methods 1 。這種 看透 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

?

Java classes 組成分析

首先容我以 3 java.util.LinkedList 為例,將 Java class 的定義大卸八塊,每一塊分別對應 4 所示的 Reflection API 5 則是“獲得 class 各區塊信息”的程序示例及執行結果,它們都取自本文示例程序的對應片段。

?

package java.util; ???????????????? ??? //(1)

import java.lang.*; ??????????????? ??? //(2)

public class LinkedList < E > ???????? ??? //(3)(4)(5)

extends AbstractSequentialList <E> ????? //(6)

implements List <E>, Queue <E>,

Cloneable, java.io.Serializable ??????? //(7)

{

private static class Entry <E> { }//(8)

public LinkedList () { } ????????? //(9)

public LinkedList (Collection<? extends E> c) { }

public E getFirst () { } ????????? //(10)

public E getLast () { }

private transient Entry<E> header = ; ? //(11)

private transient int size = 0;

}

3 :將一個 Java class 大卸八塊,每塊相應于一個或一組 Reflection APIs (圖 4 )。

?

Java classes 各成份所對應的 Reflection APIs

3 的各個 Java class 成份,分別對應于 4 Reflection API ,其中出現的 Package Method Constructor Field 等等 classes ,都定義于 java.lang.reflect

Java class 內部模塊(參見 3

Java class 內部模塊說明

相應之 Reflection API ,多半為 Class methods

返回值類型 (return type)

(1) package

class 隸屬哪個 package

getPackage()

Package

(2) import

class 導入哪些 classes

border-style: none solid solid none; border-color: rgb(236, 233, 216) windowtext windowtext rgb(236, 233, 21
分享到:
評論
wyjaw
  • 瀏覽: 9592 次
  • 性別: Icon_minigender_2
  • 來自: 北京
最近訪客 更多訪客>>
文章分類
最新評論

候捷談Java反射機制


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 四虎福利| 欧美大狠狠大臿蕉香蕉大视频 | 日本精品在线 | 国内主播大秀福利视频在线看 | 一级二级三级毛片 | 国内精品久久久久鸭 | 久久国产欧美 | 亚洲精品香蕉一区二区在线观看 | 国产成人啪午夜精品网站男同 | 午夜影院在线视频 | 欧美精品大片 | 狠狠色噜噜狠狠米奇777 | 精品一区二区三区免费观看 | 呦系列视频一区二区三区 | α片毛片 | 亚洲高清在线观看看片 | 四虎国产精品永久地址99 | 伊人激情久久综合中文字幕 | 日本一级毛片视频在线看 | 国产swag在线观看 | 免费一级毛片在线播放视频 | 国产无套免费网站 | 一级毛片秋霞特色大片 | 一类毛片 | 精品综合 | 亚洲精品不卡午夜精品 | 国产极品白嫩美女在线观看看 | 中文字幕亚洲国产 | 亚洲国产精品自产拍在线播放 | 国产日韩欧美在线观看不卡 | 特级毛片免费视频播放 | 天天色综合天天 | 亚洲精品国产美女在线观看 | 成人欧美在线 | 99热久久国产精品这 | 色综合啪啪 | 日韩一区二区三区不卡视频 | 97精品一区二区三区在线不卡 | 日韩中文字幕在线不卡 | 有码 在线 | 久久大香香蕉国产免费网vrr |