黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

候捷談Java反射機制

系統(tǒng) 2664 0

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

?

一般而言,開發(fā)者社群說到動態(tài)語言,大致認(rèn)同的一個定義是: 程序運行時,允許改變程序結(jié)構(gòu)或變量類型,這種語言稱為動態(tài)語言 。從這個觀點看, Perl Python Ruby 是動態(tài)語言, C++ Java C# 不是動態(tài)語言。

?

盡管在這樣的定義與分類下 Java 不是動態(tài)語言,它卻有著一個非常突出的動態(tài)相關(guān)機制: Reflection 。這個字的意思是 反射、映象、倒影 ,用在 Java 身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的 classes 。換句話說, Java 程序可以加載一個運行時才得知名稱的 class ,獲悉其完整構(gòu)造(但不包括 methods 定義),并生成其對象實體、或?qū)ζ? fields 設(shè)值、或喚起其 methods 1 。這種 看透 class 的能力( the ability of the program to examine itself )被稱為 introspection 內(nèi)省、內(nèi)觀、反省 )。 Reflection introspection 是常被并提的兩個術(shù)語。

?

Java 如何能夠做出上述的動態(tài)特性呢?這是一個深遠話題,本文對此只簡單介紹一些概念。整個篇幅最主要還是介紹 Reflection APIs ,也就是讓讀者知道如何探索 class 的結(jié)構(gòu)、如何對某個 運行時才獲知名稱的 class 生成一份實體、為其 fields 設(shè)值、調(diào)用其 methods 。本文將談到 java.lang.Class ,以及 java.lang.reflect 中的 Method Field Constructor 等等 classes

?

Class class

眾所周知 Java 有個 Object class ,是所有 Java classes 的繼承根源,其內(nèi)聲明了數(shù)個應(yīng)該在所有 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 )以及關(guān)鍵詞 void 。當(dāng)一個 class 被加載,或當(dāng)加載器( class loader )的 defineClass() JVM 調(diào)用, JVM 便自動產(chǎn)生一個 Class object 。如果您想借由 修改 Java 標(biāo)準(zhǔn)庫源碼 來觀察 Class object 的實際生成時機(例如在 Class constructor 內(nèi)添加一個 println() ),不能夠!因為 Class 并沒有 public constructor (見 1 )。本文最后我會撥一小塊篇幅順帶談?wù)? Java 標(biāo)準(zhǔn)庫源碼的改動辦法。

?

Class Reflection 故事起源。針對任何您想探勘的 class ,唯有先為它產(chǎn)生一個 Class object ,接下來才能經(jīng)由后者喚起為數(shù)十多個的 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 ,意指不允許任何人經(jīng)由編程方式產(chǎn)生 Class object 。是的,其 object 只能由 JVM 產(chǎn)生。

?

Class object 的取得途徑

Java 允許我們從多種管道為一個 class 生成對應(yīng)的 Class object 2 是一份整理。

Class object 誕生管道

示例

運用 getClass()

注:每個 class 都有此函數(shù)

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 的定義大卸八塊,每一塊分別對應(yīng) 4 所示的 Reflection API 5 則是“獲得 class 各區(qū)塊信息”的程序示例及執(zhí)行結(jié)果,它們都取自本文示例程序的對應(yīng)片段。

?

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 大卸八塊,每塊相應(yīng)于一個或一組 Reflection APIs (圖 4 )。

?

Java classes 各成份所對應(yīng)的 Reflection APIs

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

Java class 內(nèi)部模塊(參見 3

Java class 內(nèi)部模塊說明

相應(yīng)之 Reflection API ,多半為 Class methods

返回值類型 (return type)

(1) package

class 隸屬哪個 package

getPackage()

Package

(2) import

class 導(dǎo)入哪些 classes

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

候捷談Java反射機制


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論