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

候捷談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條評論
主站蜘蛛池模板: 最近中文字幕无吗免费视频 | 天天摸夜夜摸夜夜狠狠摸 | 一级毛片私人影院 | 亚洲精品日韩中文字幕久久久 | 在线免费黄色片 | 狠狠狠地啪香蕉 | 尹人香蕉久久99天天拍欧美p7 | 亚洲综合色就色手机在线观看 | 久久伊人网站 | 奇米888四色在线精品 | 色狠狠一区 | 亚洲欧美日韩国产综合久 | 国产激情一级毛片久久久 | 国产女人18一级毛片视频 | 精品一区二区三区在线观看视频 | 99热热| 久久久成人啪啪免费网站 | 婷婷欧美 | 久久综合久久鬼色 | 久久综合香蕉 | 亚洲国产免费 | 色四月 | 国产美女流白浆的免费视 | 97精品国产综合久久 | 欧美亚洲国产精品久久 | 精品国精品国产自在久国产应用 | 噜噜色综合 | 午夜欧美精品久久久久久久久 | 羞羞视频网站 | 久久99九九99九九精品 | 夜夜操美女 | 亚洲精品高清国产一线久久97 | 亚洲热久久| 国产乱子伦一区二区三区 | 有码在线 | 抱着cao才爽免费观看 | 久久精品国产曰本波多野结衣 | 曰本女人一级毛片看一级毛 | 亚洲成人视 | 天天舔天天射天天操 | 完整日本特级毛片 |