Java基础--反射
?1.概念
什么是反射?
(1)Java反射機制的核心是在程序運行時動態加載類并獲取類的詳細信息,從而操作類或對象的屬性和方法。 本質是JVM得到class對象之后,再通過class對象進行反編譯,從而獲取對象的各種信息。
(2)Java屬于先編譯再運行的語言,程序中對象的類型在編譯期就確定下來了, 而當程序在運行時可能需要動態加載某些類,這些類因為之前用不到, 所以沒有被加載到JVM。通過反射,可以在運行時動態地創建對象并調用其屬性, 不需要提前在編譯期知道運行的對象是誰。
Java核心技術卷I P190定義反射:能夠分析類信息的能力的程序稱為反射
類信息:屬性(域)、方法、構造器等
Class class1 = Class.forName("Performance"); System.out.println(class1); Field[] fields = class1.getFields();for (Field field : fields) {System.out.println(field);}fields就是Performance對象的屬性/域
反射機制可以用來:
- 在運行時 ,分析類的能力
- 在運行時查看對象,例如,編寫一個toString方法供所有類使用
- 實現通用的數組操作代碼
- 利用Method對象,這個對象很想像C++中的函數指針
反射的好處:
- 在程序運行過程中來操作這些對象;
- 可以解耦,提高程序的可擴展性。
2.獲取class對象的方式
?1.Class.forName("全類名"):將字節碼文件加載進內存,返回class對象(多用于配置文件,將類名定義在配置文件當中,讀取文件,加載類)
?2.類名.class:通過類名的class獲取 (多用于參數傳遞)????????
對象.getClass(): getClass()方法在object類當中定義著 (多用于對象獲取字節碼的方式)
3.對象.getClass():getClass()方法在object類當中定義著
getClass()方法定義在object類里,多用于對象獲取字節碼的方式。
需要注意的是,同一類加載器加載的文件(*.class)在一次程序運行過程中,只會被加載一次,不論你通過哪種方式獲取的class對象都是同一個。
3. Class對象功能:
1.獲取成員變量
Field[] getFields() ;//獲取所有public修飾的成員變量
Field getField(String name);//獲取指定名稱的
Field[] getDeclaredFilds();//獲取所有的成員變量,不考慮修飾符
Field getDeclaredField(String name);
2.獲取構造方法
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(類<?>...parameterTypes)
Constructor<?>[] getDeclaredConstructors()
Constructor<T> getDeclaredConstructors(類<?>...parameterTypes)
3.獲取方法名
Method[] getMethod()
Method getMethod(String name,類<?>... parameterTypes)
Method[] getDeclaredMethod()
Method getDeclaredMethod(String name,類<?>... parameterTypes)
?4.獲取類名
String getName();
Field成員變量
1. ?void set(Object obj,Object value); ? //設置值
2. ? get(Object obj); ?//獲取值
3. ? setAccessible(true); ?//忽略安全訪問修飾符的安全檢查 ? ?暴力反射 ==>private?
總結
以上是生活随笔為你收集整理的Java基础--反射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis 公网 安全_redis漏洞复
- 下一篇: 梳子刻字刻什么好_校园石阶上被人刻了17