中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java反射機制的主要功能有哪些

發布時間:2021-04-14 10:40:13 來源:億速云 閱讀:338 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Java反射機制的主要功能有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

在java中,反射主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。Java反射機制的主要功能:1、在運行時判斷任意一個對象所屬的類;2、在運行時構造任意一個類的對象;3、在運行時調用任意一個對象的方法等。

本教程操作環境:windows7系統、java8版、DELL G3電腦。

什么是反射(Reflection )?

主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力

Java反射?

在Java運行時環境中,對于任意一個類,能否知道這個類有哪些屬性和方法?對于任意一個對象,能否調用它的任意一個方法

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

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

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

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

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

Reflectio

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

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

包括其modifiers(諸如public、static等)、 superclass(例如Object)、實現了的 interfaces (例如Serializable)、也包括其fields和methods的所有信息,并可于運行時改變fields內容或調用methods。

動態語言

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

  從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。

  盡管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制:Reflection。這個字的意思是:反射、映像、倒影,用在Java身上指的是我們可以于運行時加載、探知、使用編譯期間完全未知的classes。

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

  這種“看透”class的能力(the ability of the program to examine itself)被稱為introspection(內省、內觀、反省)。Reflection和introspection是常被并提的兩個術語。

Java Reflection API簡介

  在JDK中,主要由以下類來實現Java反射機制,這些類(除了第一個)都位于java.lang.reflect包中

  Class類:代表一個類,位于java.lang包下。

  Field類:代表類的成員變量(成員變量也稱為類的屬性)。

  Method類:代表類的方法。

  Constructor類:代表類的構造方法。

  Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。

Class對象

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

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

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

常用的獲取Class對象的3種方式:

1.使用Class類的靜態方法。例如:  

Class.forName(“java.lang.String”);

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

String.class;

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

String str = “aa”; 
Class

例程1:獲取方法

例程DumpMethods類演示了Reflection API的基本作用,它讀取命令行參數指定的類名,然后打印這個類所具有的方法信息。 

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

例程2:通過反射調用方法

通過反射調用方法。詳情見代碼及注釋:

import java.lang.reflect.Method;
 
public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
 
    }
 
    public String echo(String message)
    {
        return "Hello: " + message;
    }
 
    public static void main(String[] args) throws Exception
    {
 
        // 以前的常規執行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1, 2));
        System.out.println(tester.echo("Tom"));
        System.out.println("---------------------------");
 
        // 通過反射的方式
 
        // 第一步,獲取Class對象
        // 前面用的方法是:Class.forName()方法獲取
        // 這里用第二種方法,類名.class
        Class<?> classType = InvokeTester.class;
 
        // 生成新的對象:用newInstance()方法
        Object invokeTester = classType.newInstance();
        System.out.println(invokeTester instanceof InvokeTester); // 輸出true
 
        // 通過反射調用方法
        // 首先需要獲得與該方法對應的Method對象
        Method addMethod = classType.getMethod("add", new Class[] { int.class,
                int.class });
        // 第一個參數是方法名,第二個參數是這個方法所需要的參數的Class對象的數組
 
        // 調用目標方法
        Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 });
        System.out.println(result); // 此時result是Integer類型
 
        //調用第二個方法
        Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class});
        Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
        System.out.println(result2);
 
    }
}

生成對象

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

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

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

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

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

    Class<?> classType = Customer.class;
 
    // 獲得Constructor對象,此處獲取第一個無參數的構造方法的
    Constructor cons = classType.getConstructor(new Class[] {});
 
    // 通過構造方法來生成一個對象
    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對象時需要指定名字。

感謝各位的閱讀!關于“Java反射機制的主要功能有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长丰县| 阜宁县| 封丘县| 福贡县| 深圳市| 开化县| 张家川| 鹰潭市| 奇台县| 黄梅县| 广西| 内乡县| 兴文县| 玉龙| 安达市| 建阳市| 宜兰县| 湘潭市| 西乌| 银川市| 托克逊县| 天水市| 固阳县| 宾阳县| 芦溪县| 新宁县| 平顺县| 曲麻莱县| 乌兰县| 仪陇县| 绩溪县| 河津市| 丽江市| 海城市| 巴楚县| 平阳县| 蓬安县| 武安市| 平阴县| 建水县| 泽普县|