日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java之反射机制

發布時間:2023/12/10 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java之反射机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:基本概念:在Java運行時,對于任意一個類,能否知道這個類對應的屬性和方法?對于一個對象,能否知道可以調用它的哪些方法?YES!

這種動態獲取類的信息以及動態調用對象的方法的功能來自于Java語言的反射(Reflection)機制

二:Java反射機制主要提供了以下幾個功能:

????? 1.在運行時判斷任意一個對象所屬的類。

  2.在運行時構造任意一個類的對象。

  3.在運行時判斷任意一個類所具有的成員變量和方法。

  4.在運行時調用任意一個對象的方法。

Reflection是Java被視為動態(或準動態)語言的一個關鍵性質。

  這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息。

三:動態語言

動態語言的定義“程序運行時,允許改變程序結構或者變量類型,這種語言稱為動態語言”。

然而Java不是動態語言,但是Java也可以實現反射機制(換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并生成其對象實體、或對其fields設值、或喚起其methods。)

四:Class對象:

要想使用反射,首先需要獲得待操作的類所對應的Class對象。

  Java中,無論生成某個類的多少個對象,這些對象都會對應于同一個Class對象。

  這個Class對象是由JVM生成的,通過它能夠獲悉整個類的結構。

獲取Class對象的三種方式:

1:使用Class類的靜態方法:

1 Class.forName("java.lang.String");

2.使用類的.class語法。如:

1 String.Class

3.使用對象的getClass()方法。如:

1 String str = "aa"; 2 Class<?> classType1 = str.getClass();

注意:getClass()方法定義在Object類中,不是靜態方法,需要通過對象來調用,并且它聲明為final,表明不能被子類所覆寫。

  直接print所獲得的Class對象classType會輸出:

    class 完整類名

  如果調用該Class對象的getName()方法,則輸出完整類名,不加class。

歷程1:獲取方法!

1 import java.lang.reflect.Method; 2 3 public class DumpMethods 4 { 5 public static void main(String[] args) throws Exception //在方法后加上這句,異常就消失了 6 { 7 //獲得字符串所標識的類的class對象 8 Class<?> classType = Class.forName("java.lang.String");//在此處傳入字符串指定類名,所以參數獲取可以是一個運行期的行為,可以用args[0] 9 10 //返回class對象所對應的類或接口中,所聲明的所有方法的數組(包括私有方法) 11 Method[] methods = classType.getDeclaredMethods(); 12 13 //遍歷輸出所有方法聲明 14 for(Method method : methods) 15 { 16 System.out.println(method); 17 } 18 } 19 20 }

Method 提供關于類或接口上單獨某個方法(以及如何訪問該方法)的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。

Method 允許在匹配要調用的實參與底層方法的形參時進行擴展轉換;但如果要進行收縮轉換,則會拋出 IllegalArgumentException。

2:通過反射調用方法

1 import java.lang.reflect.Method; 2 3 public class InvokeTester 4 { 5 public int add(int param1, int param2) 6 { 7 return param1 + param2; 8 9 } 10 11 public String echo(String message) 12 { 13 return "Hello: " + message; 14 } 15 16 public static void main(String[] args) throws Exception 17 { 18 19 // 以前的常規執行手段 20 InvokeTester tester = new InvokeTester(); 21 System.out.println(tester.add(1, 2)); 22 System.out.println(tester.echo("Tom")); 23 System.out.println("---------------------------"); 24 25 // 通過反射的方式 26 27 // 第一步,獲取Class對象 28 // 前面用的方法是:Class.forName()方法獲取 29 // 這里用第二種方法,類名.class 30 Class<?> classType = InvokeTester.class; 31 32 // 生成新的對象:用newInstance()方法 33 Object invokeTester = classType.newInstance(); 34 System.out.println(invokeTester instanceof InvokeTester); // 輸出true 35 36 // 通過反射調用方法 37 // 首先需要獲得與該方法對應的Method對象 38 Method addMethod = classType.getMethod("add", new Class[] { int.class, 39 int.class }); 40 // 第一個參數是方法名,第二個參數是這個方法所需要的參數的Class對象的數組 41 42 // 調用目標方法 43 Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 }); 44 System.out.println(result); // 此時result是Integer類型 45 46 //調用第二個方法 47 Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class}); 48 Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"}); 49 System.out.println(result2); 50 51 } 52 }

生成對象

若想通過類的不帶參數的構造方法來生成對象,我們有兩種方式:

  1.先獲得Class對象,然后通過該Class對象的newInstance()方法直接生成即可:

Class<?> classType = String.class;Object obj = classType.newInstance();

????? 2.先獲得Class對象,然后通過該對象獲得對應的Constructor對象,再通過該Constructor對象的newInstance()方法生成

  (其中Customer是一個自定義的類,有一個無參數的構造方法,也有帶參數的構造方法):???

1 Class<?> classType = Customer.class; 2 3 // 獲得Constructor對象,此處獲取第一個無參數的構造方法的 4 Constructor cons = classType.getConstructor(new Class[] {}); 5 6 // 通過構造方法來生成一個對象 7 Object obj = cons.newInstance(new Object[] {});

?

????? 若想通過類的帶參數的構造方法生成對象,只能使用下面這一種方式:

  (Customer為一個自定義的類,有無參數的構造方法,也有一個帶參數的構造方法,傳入字符串和整型)

Class<?> classType = Customer.class;Constructor cons2 = classType.getConstructor(new Class[] {String.class, int.class});Object obj2 = cons2.newInstance(new Object[] {"ZhangSan",20});

可以看出調用構造方法生成對象的方法和調用一般方法的類似,不同的是從Class對象獲取Constructor對象時不需要指定名字,而獲取Method對象時需要指定名字。

?

轉載于:https://www.cnblogs.com/chimingyang/p/5549657.html

總結

以上是生活随笔為你收集整理的Java之反射机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。