反射筆記

反射定義:java

       反射會形成性能的降低,而後簡而言之反射就把相應的類映射成對應的class,而後透過調用java自帶的方法能夠這個class對象進行相應的操做,可以完整的調用它全部的方法與屬性,包換私有的編程

     JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。數組

Java反射機制主要提供瞭如下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具備的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。ide

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

通常而言,開發者社羣說到動態語言,大體認同的一個定義是:「程序運行時,容許改變程序結構或變量類型,這種語言稱爲動態語言」。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。this

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

J2se1.6提供的API.net

 

 

字節碼定義:代理

Bytecode一般指的是已經通過編譯,但與特定機器碼無關,須要直譯器轉譯後才能成爲機器碼的中間代碼。Bytecode一般不像源碼同樣可讓人閱讀,而是編碼後的數值常量、引用、指令等構成的序列。

Bytecode主要爲了實現特定軟件運行和軟件環境、硬件環境無關。Bytecode的實現方式是經過編譯器和虛擬機器。編譯器將源碼編譯成 Bytecode,特定平臺上的虛擬機器將Bytecode轉譯爲能夠直接執行的指令。Bytecode的典型應用爲Java語言。

得到字符碼的方式有三種:

一、  類名.class 例如,System.class

二、  對象.getClass(),例如,new Date().getClass();

三、  Class.forName(「類名」),例如Class.ForName(「java.util.Date」);

java 1.6提供的API信息以下:

方法摘要

 boolean

equals(Object obj)
 將此 Constructor 對象與指定的對象進行比較。

<T extends Annotation>
T

getAnnotation(Class<T> annotationClass)
若是存在該元素的指定類型的註釋,則返回這些註釋,不然返回 null。

 Annotation[]

getDeclaredAnnotations()
返回直接存在於此元素上的全部註釋。

 Class<T>

getDeclaringClass()
返回 Class 對象,該對象表示聲明由此 Constructor 對象表示的構造方法的類。

 Class<?>[]

getExceptionTypes()
返回一組表示聲明要拋出的異常類型的 Class 對象,這些異常是由此 Constructor 對象表示的底層構造方法拋出的。

 Type[]

getGenericExceptionTypes()
返回一組 Type 對象,這些對象表示聲明要由此 Constructor 對象拋出的異常。

 Type[]

getGenericParameterTypes()
          按照聲明順序返回一組 Type 對象,這些對象表示此 Constructor 對象所表示的方法的形參類型。

 int

getModifiers()
          以整數形式返回此 Constructor 對象所表示構造方法的 Java 語言修飾符。

 String

getName()
          以字符串形式返回此構造方法的名稱。

 Annotation[][]

getParameterAnnotations()
          按照聲明順序返回一組數組,這些數組表示經過此 Constructor 對象表示的方法的形參上的註釋。

 Class<?>[]

getParameterTypes()
          按照聲明順序返回一組 Class 對象,這些對象表示此 Constructor 對象所表示構造方法的形參類型。

 TypeVariable<Constructor<T>>[]

getTypeParameters()
          按照聲明順序返回一組 TypeVariable 對象,這些對象表示經過此 GenericDeclaration 對象所表示的通常聲明來聲明的類型變量。

 int

hashCode()
          返回此 Constructor 的哈希碼。

 boolean

isSynthetic()
          若是此構造方法是一個複合構造方法,則返回 true;不然返回 false。

 boolean

isVarArgs()
          若是聲明此構造方法能夠帶可變數量的參數,則返回 true;不然返回 false。

 T

newInstance(Object... initargs)
          使用此 Constructor 對象表示的構造方法來建立該構造方法的聲明類的新實例,並用指定的初始化參數初始化該實例。

 String

toGenericString()
          返回描述此 Constructor 的字符串,其中包括類型參數。

 String

toString()
          返回描述此 Constructor 的字符串。

 

下面的源程序,主要是對反射字段的應用

ReflectTest類:

ReflectTest


ReflectPoint類:

 1 package day1; 2  3 public class ReflectPoint{ 4       private int x; 5       public int y; 6       public String str1="ball"; 7       public String str2="basketball"; 8       public String str3="itcast"; 9     public ReflectPoint(int x, int y) {10         super();11         this.x = x;12         this.y = y;13     }14     /* (non-Javadoc)15  * @see java.lang.Object#toString()16 */ 17     @Override18     public String toString() {19         // TODO Auto-generated method stub 20         return str1+":"+str2+":"+str3;21     }22 23     }
相關文章
相關標籤/搜索