java學習筆記(基礎篇)—反射

1、 反射 :自描述或者自定義

一個類或者對象經過反射能夠得到自身的對象,該對象是一個java.lang.Class
的對象(就像一個鏡像文件)。一個對象或者類得到自身的Class對象的過程稱爲反射。
java.lang.Class:是類鏡像,鏡像對象Class類鏡像的做用能夠獲取該類和該對象的全部屬性,方法和構造器,以及屬性方法和構造器修飾符,修改私有屬性的值。調用方法和調用構造器等等。
Class----實例化----->class-----實例化----->對象
對象------抽象化----->class------抽象化----->Class
抽象:具備相同屬性和行爲抽象出來java

public final class Class{
      Field[] fileds;
      Method[] methods;
      Constructor[] cons;
}
反射API:
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)反射機制經過在運行時探查字段和方法,從而能夠幫助寫出通用性很好的程序,這項能力對系統編程來講特別有用,但它並不適合於應用編程。並且,反射是脆弱的——編譯不能幫助你發現編譯錯誤,任何錯誤在運行時被發現而且都會致使異常。致使代碼不安全。

相關文章
相關標籤/搜索