反射定義: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 |
||
|
getAnnotation(Class<T> annotationClass) |
|
getDeclaredAnnotations() |
||
getDeclaringClass() |
||
Class<?>[] |
getExceptionTypes() |
|
Type[] |
getGenericExceptionTypes() |
|
Type[] |
getGenericParameterTypes() |
|
int |
getModifiers() |
|
getName() |
||
Annotation[][] |
getParameterAnnotations() |
|
Class<?>[] |
getParameterTypes() |
|
TypeVariable<Constructor<T>>[] |
getTypeParameters() |
|
int |
hashCode() |
|
boolean |
isSynthetic() |
|
boolean |
isVarArgs() |
|
newInstance(Object... initargs) |
||
toGenericString() |
||
toString() |
下面的源程序,主要是對反射字段的應用
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 }