Java反射機制的學習 – JAVA編程語言程序開發技術文章

nbsp;    Java反射機制是Java語言被視為準動態語言的關鍵性質。Java反射機制的核心就是允許在運行時通過Java Reflection APIs來取得已知名字的class類的相關信息,動態地生成此類,並調用其方法或修改其域(甚至是本身聲明為private的域或方法)。


也許你使用Java已經很長時間瞭,可是幾乎不會用到Java反射機制。你會嗤之以鼻地告訴我,Java反射機制沒啥用。或許在J2EE、J2SE等平臺,Java反射機制沒啥用(具體我也不瞭解,不多做評論),但是在Android應用開發中,該機制會帶給你許多驚喜。


如果熟悉Android,那麼你應該知道,Google不知出於什麼原因,在系統源碼中一些類或方法中經常加上“@hide”註釋標記。它的作用是使這個方法或類在生成SDK時不可見,因此由此註釋的東西,你在編譯期是不可見的。這就出現瞭一些問題。一些明明可以訪問的東西編譯期卻無法訪問瞭!這使得你的程序有些本來可以完成的功能無法編譯通過。


當然,有一種辦法是自己去掉Android源碼中的所有“@hide”標記,然後重新編譯一份自己的SDK。另一種辦法就是使用Java反射機制。當然,你還可以利用反射來訪問存在訪問限制的方法和修改其域。不過這種使用方法比較特殊,我們在文章的最後單獨討論。


從Class類說起
如果你使用Java,那麼你應該知道Java中有一個Class類。Class類本身表示Java對象的類型,我們可以通過一個Object(子)對象的getClass方法取得一個對象的類型,此函數返回的就是一個Class類。當然,獲得Class對象的方法有許多,但是沒有一種方法是通過Class的構造函數來生成Class對象的。


也許你從來沒有使用過Class類,也許你曾以為這是一個沒什麼用處的東西。不管你以前怎麼認為,Class類是整個Java反射機制的源頭。一切關於Java反射的故事,都從Class類開始。


因此,要想使用Java反射,我們首先得到Class類的對象。下表列出瞭幾種得到Class類的方法,以供大傢參
考。

Class object 誕生管道

示例

運用getClass()


註:每個class 都有此函數

String str = “abc”;


Class c1 = str.getClass();

運用


Class.getSuperclass()

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;

獲取一些基本信息


在我們得到一個類的Class類對象之後,Java反射機制就可以大施拳腳瞭。首先讓我們來瞭解下如何獲取關於某一個類的一些基本信息。

<td style="BORDER-RIGHT: rgb(0,0,0) 0.75pt outset; PADDING-RIGHT: 0pt; BORDER-TOP: rgb(0,0,0) 0.75pt outset; PADDING-LEFT: 0pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 118.75pt; PADDING-TOP: 0pt; BORDER-BOTTOM: rgb(0,0,0) 0.75pt o

發佈留言

Java class 內部模塊