一個類或者對象經過反射能夠得到自身的對象,該對象是一個java.lang.Class
的對象(就像一個鏡像文件)。一個對象或者類得到自身的Class對象的過程稱爲反射。
java.lang.Class:是類鏡像,鏡像對象Class類鏡像的做用能夠獲取該類和該對象的全部屬性,方法和構造器,以及屬性方法和構造器修飾符,修改私有屬性的值。調用方法和調用構造器等等。
Class----實例化----->class-----實例化----->對象
對象------抽象化----->class------抽象化----->Class
抽象:具備相同屬性和行爲抽象出來java
public final class Class{ Field[] fileds; Method[] methods; Constructor[] cons; }
java.lang.Class java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Array java.lang.reflect.Constructor
class Person{}
Person建立100個對象,建立多少個Person的Class類型對象?編程
1個,類加載的時候建立Person的Class類型對象。api
1)獲取類鏡像(Class對象),三種方式
a)Class.forName(String className)
b)數據類型.class
c)對象.getClass()
2)經過類鏡像實例化對象(不經過new方式建立對象)數組
Object obj=類鏡像對象.newInstance()。安全
默認會調用class類的無參構造器。code
3)經過實例化對象操做屬性,方法,構造器
a)獲取全部的屬性(屬性名和修飾符和數據類型)。
b)獲取全部的方法(方法名和修飾符和返回值和參數列表)
c)獲取全部構造器(名字和修飾符和參數列表)
d)修飾屬性的值
e)調用方法:invoke()
f)調用指定構造器建立的對象對象
1)在運行的時候才知道類名
2)在運行的時候才知道屬性名
3)在運行的時候才知道方法名接口
1) 肯定一個對象的class
2) 能夠得到一個類的修飾符、字段、方法、構造器和父類。
3) 得到接口聲明的常量和方法。
4) 建立Class的實例,直到運行時纔得到。
5) 運行前即便字段名字不知道,能夠到程序運行時得到和修改這些字段的值。
6) 運行前即便對象的方法名不知道,能夠到程序運行時觸發調用該方法。
7) 運行前建立了一個大小和元素都未知的新數組,
能夠到運行時修改數組的元素。get
1)修改私有屬性的值
2)調用任何對象的任何方法
3)不經過new方式建立對象編譯
1)反射能夠讓咱們利用這個Class對象來獲取和修改私有的變量和方法,不經過共有的方法去得到(原來咱們例子都是經過一個public的方法來設置和獲取私有的變 量),能夠破壞數據的封裝性。 2)反射機制經過在運行時探查字段和方法,從而能夠幫助寫出通用性很好的程序,這項能力對系統編程來講特別有用,但它並不適合於應用編程。並且,反射是脆弱的——編譯不能幫助你發現編譯錯誤,任何錯誤在運行時被發現而且都會致使異常。致使代碼不安全。