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

候捷談Java反射機制

系統 2123 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條評論
主站蜘蛛池模板: 亚洲欧美日韩国产精品久久 | 久久这里有精品视频任我鲁 | 亚洲日本人成中文字幕 | 老子午夜伦不卡影院 | 性生活视频免费观看 | 亚欧洲精品在线视频免费观看 | 九九精品视频在线免费观看 | 久久视频精品a线视频在线观看 | 国产se| 欧美性猛交ⅹxxx乱大交按摩 | 中国国产高清一级毛片 | 久久国产中文字幕 | 国产精品一一在线观看 | 国产成人毛片视频不卡在线 | 青青青爽国产在线视频 | 狠狠综合久久久久综合小说网 | 国产第一页久久亚洲欧美国产 | 国产精品偷伦视频免费观看的 | 网红被免费网站视频在线 | 亚洲欧美国产18 | 日本不卡毛片一二三四 | 天天躁狠狠躁夜夜躁 | 我要看免费一级毛片 | 亚洲va中文字幕欧美不卡 | 国产成人a毛片在线 | 女人18一级毛片免费观看 | www.久操| 久久伊人中文字幕 | 中文字幕亚洲无线码在线一区 | 精品理论片一区二区三区 | 在线综合 亚洲 欧美中文字幕 | 深夜福利视频在线一区 | 国产一区二区三区在线影院 | 免费污视频在线观看 | 国产女人成人精品视频 | 久久综合九色综合97_ 久久久 | www.日韩视频 | 婷婷中文字幕 | 成熟女人50岁一级毛片不卡 | 四虎影视成人永久在线观看 | 毛片精品 |