更新時間:2022-10-20 10:20:51 來源:動力節點 瀏覽1493次
java反射機制可以動態獲取類的各種信息,如方法、屬性等。并且可以生成該類的對應實例;可以調用任何對象的任何方法,即jvm(虛擬機)允許代碼在運行過程中獲取類的內部信息
在使用反射機制時,一個非常重要的Class就是Class,它是由類加載后的 JVM(虛擬機)
在運行時確定任何對象的類
在運行時構造任何類的對象;
在運行時確定任何類的成員變量和方法;
在運行時調用任意對象的方法;
生成動態代理;
優勢:
運行時可以判斷類型并動態加載類,提高了代碼的靈活性。訪問不可訪問的成員變量等;獲取類的方法和成員變量;
缺點:
Java反射相當于一系列解釋操作。這個過程需要通知jvm(虛擬機),所以性能比直接源碼慢很多。它無法識別編譯器中的錯誤。錯誤只能在運行時發現,增加了難度
java.lang.Class //類
java.lang.reflect.Constructor //構造方法
java.lang.reflect.Field //類的成員變量
java.lang.reflect.Method //類方法
java.lang.reflect.Modifier //訪問權限
模塊化開發,通過反射調用對應的字節碼;
動態代理設計模式
Spring和hibernate框架等
一個結合注解的框架,如Retrofit
例子:
JDBC編程中,加載數據庫驅動時應用反射機制;
Class.forName("com.mysql.jdbc.Driver") 加載驅動類并在DriverManager類中注冊驅動類實例。
獲取類對象的三種方法
1.使用已知對象的“getClass()”方法,例如:
/*
* 如何獲取字節碼對象:
* 要使用此方法,您必須指定特定的類并創建對象。
*/
公共類 GetClassTest {
/*類的方法和屬性*/
公共靜態無效get(){
GetClassTest 測試 = 新的 GetClassTest();
Class class = test.getClass();//可以返回<span style = "font family: Arial, Helvetica, sans serif;" > getclasstest 類的類對象</ span>
}
}
2.Class.forName("類名"),例如
/*
* 只要傳遞給定類的字符串名稱,就可以獲得該類,擴展性更強。
* 但是可以通過使用Class中的方法來完成。
* 這個方法是forName
* 這種方法只要有名字就更方便,擴展性更好。
*/
公共類 ForNameTest {
/*類的方法和屬性*/
公共靜態無效get(){
Class class = Class.forName("Package name.RefClass");//加載RefClass Class,生成對應Class對象,初始化RefClass Class;
}
}
3.類名class,例如:
/*
* 任何數據類型都有一個靜態屬性Class來獲取其對應的類圖像。
* 比較簡單,但是我們還是需要在類中顯式使用靜態成員。
* 擴展不夠。
*/
公共類 ClassTest {
/*類的方法和屬性*/
公共靜態無效get(){
Class class = RefClass.class;//加載RefClass Class并生成對應的Class對象,但RefClass Class沒有初始化;
}
}
可通過類對象獲取的信息
class.getName();//獲取類名包含包名的路徑
class.getPackage();//獲取類的包信息
class.getSimpleName();//獲取類名
class.getModifiers();//獲取類訪問權限
class.getDeclaredClasses();//內部類
class.getDeclaringClass();//外部類
class.getType();//字段類型
班級。getModifiers();//字段訪問修飾符
class.getMethods();// 獲取類中的所有公共方法,包括父類中的方法
class.getDeclaredMethods();// 獲取類中的所有方法,包括公共和私有方法,但不包括父類中的方法
class.isPrimitive();//判斷是否為基本類型
class.isArray();//判斷是否為集合類
class.isAnnotation();//判斷是否為注解類
class.isInterface();//判斷是否為接口類
class.isEnum();//判斷是否為枚舉類
class.isAnonymousClass();//判斷是否為匿名內部類
class.isAnnotationPresent(Deprecated.class);//判斷是否被注解類修改
獲取方法的方法名和參數
//遍歷所有方法
for (方法 m : 聲明方法){
// 獲取方法名
System.out.print(m.getName()+"(");
// 用于判斷是否為第一個參數
布爾 isFrist = true;
// 獲取方法的所有參數類
類<?>[] parameterTypes = m.getParameterTypes();
//遍歷所有參數
for (Class<?> clazz : parameterTypes){
如果(isFrist){
System.out.print(clazz.getName());
isFrist = 假;
} 別的 {
System.out.print("," + clazz.getName());
}
}
System.out.println(");");
}
以上就是關于“Java反射機制的應用”介紹,大家如果想了解更多相關知識,不妨來關注一下動力節點的Java在線學習,里面的課程內容細致全面,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習