首頁 Java java教程 Java反射的分析介紹

Java反射的分析介紹

Mar 09, 2017 pm 07:05 PM
java反射

這篇檔案講述Java反射的分析介紹

一、什麼是反射?
  透過百度百科我們可以知道,Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態(或準動態,為啥要說是準動態,因為一般而言的動態語言定義是程式執行時,允許改變程式結構或變數類型,這種語言稱為動態語言。從這個觀點來看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。

二、反射能做什麼?
  我們知道反射機制允許程式在運行時取得任何一個已知名稱的class的內部信息,包括包括其modifiers(修飾符),fields(屬性),methods(方法)等,並可於運行時改變fields內容或調用methods。那麼我們便可以更靈活的編寫代碼,代碼可以再運行時裝配,無需在組件之間進行源代碼鏈接,降低代碼的耦合度;還有動態代理的實現等等;但是需要注意的時反射使用不當會成本很高!

三、反射的具體實作

  下面是一個基本的類別Person

package com.ys.reflex;
public class Person {
    //私有属性
    private String name = "Tom";
    //公有属性
    public int age = 18;
    //构造方法
    public Person() {    
    }
    //私有方法
    private void say(){
        System.out.println("private say()...");
    }
    //公有方法
    public void work(){
        System.out.println("public work()...");
    }
}
登入後複製

①、得到Class 的三種方式

//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
//  类型的对象,而我不知道你具体是什么类,用这种方法
  Person p1 = new Person();
  Class c1 = p1.getClass();
        
//2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
//  这说明任何一个类都有一个隐含的静态成员变量 class
  Class c2 = Person.class;
        
//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
//   但可能抛出 ClassNotFoundException 异常
  Class c3 = Class.forName("com.ys.reflex.Person");
登入後複製

要注意的是:一個類別在JVM 中只會有一個Class 實例,即我們對上面所取得的c1,c2,c3進行equals 比較,發現都是true

 

②、透過Class 類別取得成員變數、成員方法、介面、超類別、建構方法等









##################################### #######查閱API 可以看到Class 有許多方法:######  getName():取得類別的完整名字。 ###  getFields():取得類別的public型別的屬性。 ###  getDeclaredFields():取得類別的所有屬性。包括private 宣告的和繼承類別###  getMethods():取得類別的public型別的方法。 ###  getDeclaredMethods():取得類別的所有方法。包含private 宣告的和繼承類別###  getMethod(String name, Class[] parameterTypes):取得類別的特定方法,name參數指定方法的名字,parameterTypes 參數指定方法的參數類型。 ###  getConstructors():取得類別的public型別的建構方法。 ###  getConstructor(Class[] parameterTypes):取得類別的特定建構方法,parameterTypes 參數指定建構方法的參數類型。 ###  newInstance():透過類別的不含參數的建構方法來建立這個類別的一個物件。 ######我們透過一個例子來綜合示範上面的方法:###
//获得类完整的名字
String className = c2.getName();
System.out.println(className);//输出com.ys.reflex.Person
        
//获得类的public类型的属性。
Field[] fields = c2.getFields();
for(Field field : fields){
   System.out.println(field.getName());//age
}
        
//获得类的所有属性。包括私有的和继承类的
Field [] allFields = c2.getDeclaredFields();
for(Field field : allFields){
    System.out.println(field.getName());//name    age
}
        
//获得类的public类型的方法。这里包括 Object 类的一些方法
Method [] methods = c2.getMethods();
for(Method method : methods){
    System.out.println(method.getName());//work waid equls toString hashCode等
}
        
//获得类的所有方法。
Method [] allMethods = c2.getDeclaredMethods();
for(Method method : allMethods){
    System.out.println(method.getName());//work say
}
        
//获得指定的属性
Field f1 = c2.getField("age");
System.out.println(f1);
//获得指定的私有属性
Field f2 = c2.getDeclaredField("name");
//启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
f2.setAccessible(true);
System.out.println(f2);
                
//创建这个类的一个对象
Object p2 =  c2.newInstance();
//将 p2 对象的  f2 属性赋值为 Bob,f2 属性即为 私有属性 name
f2.set(p2,"Bob");
//使用反射机制可以打破封装性,导致了java对象的属性不安全。 
System.out.println(f2.get(p2)); //Bob
        
//获取构造方法
Constructor [] constructors = c2.getConstructors();
for(Constructor constructor : constructors){
    System.out.println(constructor.toString());//public com.ys.reflex.Person()
}
登入後複製
###四、反射總結######靈活使用反射能讓我們程式碼更加靈活,這裡例如JDBC原生程式碼註冊驅動,hibernate 的實體類,Spring 的AOP等等都有反射的實現。但凡事都有兩面性,反射也會增加系統的效能,複雜性等,合理使用才是真! ###### ###

以上是Java反射的分析介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
使用Java反射進行逆向工程:揭秘軟體的內部運作方式 使用Java反射進行逆向工程:揭秘軟體的內部運作方式 Feb 19, 2024 pm 11:20 PM

Java反射是一個強大的工具,它可以讓你存取類別的私有欄位和方法,從而揭露軟體的內部運作方式。這在逆向工程、軟體分析和調試等領域非常有用。要使用Java反射,首先需要匯入java.lang.reflect套件。然後,你可以使用Class.forName()方法來取得一個類別的Class物件。一旦你有了Class對象,你就可以使用各種方法來存取類別的欄位和方法。例如,你可以使用getDeclaredFields()方法來取得類別的所有字段,包括私有字段。你也可以使用getDeclaredMethods()方法

java反射如何取得屬性的值 java反射如何取得屬性的值 Jan 03, 2024 pm 03:05 PM

取得方法:1、建立一個範例對象;2、透過field.get(person)取得了欄位的值,其中person是範例對象,而field是Field對象,表示一個欄位;3、透過setAccessible(true)設定欄位為可存取狀態,即使是私有欄位也可以取得其值;4、遍歷欄位數組,可以取得每個欄位的名稱和對應的值,並列印出來即可。

如何使用java反射取得物件屬性和值 如何使用java反射取得物件屬性和值 Jan 03, 2024 pm 02:43 PM

取得方法:1、建立一個Person類,透過反射取得了該類別的Class物件;2、使用getDeclaredFields方法取得了該類別的所有欄位;3、透過遍歷欄位數組,設定欄位為可存取狀態,然後使用get方法取得欄位的值,並列印欄位名稱和值即可。

java的反射機制原理是什麼 java的反射機制原理是什麼 Jun 21, 2023 am 10:53 AM

Java反射機制原理是,當一個字節碼檔案載入到記憶體的時候,jvm會對該字節碼進行解剖,創建一個對象的Class對象,jvm把字節碼文件資訊都儲存到Class對像中,只要取得到Class對象,就能使用該對象設定對象的屬性或方法等。反射機制是,在運行狀態中對任意一個類,都知道這個類的所有屬性和方法,對於任意一個對象,能夠調用其任意屬性和方法,動態獲取資訊以及動態調用對象方法的功能。

深入理解Java反射機制的原理與應用 深入理解Java反射機制的原理與應用 Dec 23, 2023 am 09:09 AM

深入理解Java反射機制的原理與應用一、反射機制的概念與原理反射機制是指在程式執行時動態地獲取類別的資訊、存取與操作類別的成員(屬性、方法、建構方法等)的能力。透過反射機制,我們可以在程式運行時動態地建立物件、呼叫方法和存取屬性,而不需要在編譯時知道類別的具體資訊。反射機制的核心是java.lang.reflect套件中的類別和介面。其中,Class類別代表一個類別的位元組

如何使用Java反射機制建立物件? 如何使用Java反射機制建立物件? Apr 15, 2024 pm 04:18 PM

透過Java反射機制建立物件步驟如下:載入目標類別:使用Class.forName()方法。取得建構子:使用getDeclaredConstructor()方法。建立物件:使用newInstance()方法傳遞參數。

Java中的NoSuchFieldException異常在哪個場景下出現? Java中的NoSuchFieldException異常在哪個場景下出現? Jun 25, 2023 am 11:51 AM

Java中的NoSuchFieldException異常指的是反射過程中試圖存取不存在的欄位(Field)時拋出的例外狀況。在Java中,反射可以讓我們透過程式碼來操縱程式中的類別、方法、變數等,使得程式具有更高的靈活性和擴充性。但是,在使用反射時,如果存取的欄位不存在,則會拋出NoSuchFieldException異常。 NoSuchFieldException

java反射有哪些呼叫方法 java反射有哪些呼叫方法 Dec 22, 2023 pm 05:09 PM

java反射呼叫方法有:1、Class類別;2、Constructor類別;3、Method類別;4、Field類別;5、ClassLoader類別。詳細介紹:1、Class類,用於取得類別的信息,包括類別的名稱、成員變數和方法等,可以透過Class類的"newInstance()"方法建立類別的實例;2、Constructor類,用於取得建構函數的參數類型、修飾符和返回類型等資訊等等。

See all articles