java基礎-----反射

一、反射的概述

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的字節碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節碼文件對應的Class類型的對象.

什麼是反射

反射就是把java類中的各種成分映射成一個個的Java對象

例如:一個類有:成員變量、方法、構造方法、包等等信息,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)。

如圖是類的正常加載過程:反射的原理在與class對象。熟悉一下加載的時候:Class對象的由來是將class文件讀入內存,併爲之創建一個Class對象。
在這裏插入圖片描述

反射方法

基本信息操作

int modifier = clazz.getModifiers(); //獲取類的修飾符
Package package= clazz.getPackage();//獲取類的包名
String fullClassName = clazz.getName();//獲取類的全路徑名稱
String simpleClassName = clazz.getSimpleName();//獲取類的簡單名稱
ClassLoader classLoader = clazz.getClassLoader();//獲取類的類加載器
Class[] interfacesClasses = clazz.getInterfaces();//獲取類實現的接口列表
Class fc= clazz.getSuperclass();//獲取類的父類
Annotation[] annotations= clazz.getAnnotations(); //獲取類的註解列表

反射-字段操作

Field[] fields = clazz.getFields();//獲取類中所有的公有字段 包含繼承
Field[] declaredFields=clazz.getDeclaredFields();//獲取類中定義的字段 內部
Field nameField=clazz.getField("name");//獲取指定名稱的公有字段
Field likeDescField=clazz.getDeclaredField("likeDesc");//獲取指定名稱類中

定義的字段

int modifersFiled = likeDescField.getModifiers();//獲取字段的修飾
nameField.setAccessible(true);//指定字段強制訪問
nameField.set(person,"小皮皮");//成員字段賦值(需指定對象)
descriptionField.set(null,"沒有結婚的都是男孩!");//靜態字段賦值

反射-方法操作

Method[] methods = clazz.getMethods();//獲取類中所有的公有方法 繼承
Method[] declaredMethods = clazz.getDeclaredMethods();//獲取類中定義的方法
Method talkMethod = clazz.getMethod("talk", String.class);//獲取類中指定名稱和參數的公有方法
Method pugMethod = clazz.getDeclaredMethod("pickUpGirls") //獲取類中定義指定名稱和參數的方法
int modifers = pugMethod .getModifiers();//獲取方法的修飾符
talkMethod.invoke(boy,"I LOVE SEVEN");//指定對象進行成員方法的調用
pugMethod .setAccessible(true);//指定方法的強制訪問
pickUpGirlsMethod.invoke(null);//靜態方法的調用

反射-構造器操作

Constructor[] cons = clazz.getConstructors();//獲取類中所有的公有構造器
Constructor[] cons = clazz.getDeclaredConstructors();//獲取類中所有的構造器
Constructor conNoParam= clazz.getDeclaredConstructor();//獲取類中無參的構造器
Constructor con= clazz.getDeclaredConstructor(String.class,String.class); //獲取類中有參構造
int modifers = con.getModifiers();//獲取構造器的修飾符
conNoParam.newInstance();//構造器實例對象
con.setAccessible(true);//指定方法的強制訪問
con.newInstance('abc','def');//有參構造調用
class.newInstacne();//class直接調用默認無參構造

反射實例
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章