溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java反射如何使用

發(fā)布時(shí)間:2021-11-09 15:06:34 來(lái)源:億速云 閱讀:340 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Java反射如何使用,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

    反射

    相信剛接觸Java的,第一句肯定會(huì)問(wèn)什么是反射呢?反射有什么作用呢?為什么使用反射呢?首先反射是Java的特征之一,項(xiàng)目中Java程序在運(yùn)行的過(guò)程中,自動(dòng)去識(shí)別并創(chuàng)建對(duì)應(yīng)的類,能夠動(dòng)態(tài)的調(diào)用類的屬性、構(gòu)造方法、類中的方法。一句話描述:在程序中能動(dòng)態(tài)調(diào)用不同的類和屬性,去執(zhí)行特定的操作。

    正因?yàn)榉瓷淠軌蛟谶\(yùn)行時(shí)動(dòng)態(tài)加載需要的對(duì)象,所以很多框架中都使用到了反射。本次為了大家很好的理解反射,將基于反射創(chuàng)建對(duì)象、獲取反射中的對(duì)象、獲取類中屬性、獲取類中的構(gòu)造方法、獲取類中方法幾個(gè)方面進(jìn)行介紹,下面開始進(jìn)入正題。

    基礎(chǔ)數(shù)據(jù)準(zhǔn)備

    為了方便演示,創(chuàng)建了一個(gè)基礎(chǔ)的對(duì)象類。并基于他進(jìn)行本次的介紹。創(chuàng)建的演示類JueJinUser如下,包含四個(gè)屬性,分別有g(shù)et和set方法,還有toString方法,沒有創(chuàng)建構(gòu)造方法,下面會(huì)介紹通過(guò)反射自動(dòng)創(chuàng)建的相關(guān)反射的方法。

    public class JueJinUser {
        private Integer id;
    
        private String name;
    
        private String title;
    
        private Integer age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "JueJinUser{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", title='" + title + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    基于反射創(chuàng)建對(duì)象

    基于反射創(chuàng)建類對(duì)象主要有兩種方式:第一種是通過(guò)類對(duì)象的newInstance()方法創(chuàng)建對(duì)象,第二種是通過(guò)構(gòu)造器中的 newInstance()方法創(chuàng)建對(duì)象。

    類對(duì)象的newInstance()方法

    ??類對(duì)象的newInstance()方法創(chuàng)建方法如下:

       Class class = JueJinUser.class;
           JueJinUser jueJinUseByClass = (JueJinUser) class.newInstance();

    構(gòu)造器的newInstance()方法

    Class jueJinUserClass = JueJinUser.class;
            Constructor constructor = jueJinUserClass.getConstructor();
            JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();

    需要注意的是,兩種創(chuàng)建方式中第一種基于類對(duì)象的newInstance()的方法只能是無(wú)參構(gòu)造方法,而第二種基于構(gòu)造器的 newInstance()方法可以有有參構(gòu)造方法和無(wú)參構(gòu)造方法,比較靈活。

    獲取反射中的對(duì)象

    獲取反射對(duì)象的方式有三種,分別是:Class.forName、.class 方法和getClass() 方法。獲取反射中對(duì)象的方法大家在項(xiàng)目中使用的還是比較多的,相信大家都不陌生。

    Class.forName

    Class clzForName = Class.forName("com.example.demo.module.JueJinUser");

    .class 方法

    Class clzForClass =JueJinUserString.class;

    getClass() 方法

    JueJinUser JueJinUser = new JueJinUser();
        Class clzNewObject = str.getClass();

    獲取類中屬性

    通過(guò)getFields和getDeclaredFields的方法,可以獲取類中的屬性信息,其中g(shù)etFields可以獲取類中的公有屬性值,而getDeclaredFields的方法,獲取所有類中的屬性信息,但是無(wú)法獲取到父類的信息。格式如下:

    Class clz = JueJinUser.class;
            Field[] fields = clz.getFields();
            System.out.println("--- getFields start ---");
            for (Field field : fields) {
                System.out.println(field.getName());
            }
            System.out.println("--- getFields end ---");
    
    
            System.out.println("--- getDeclaredFields start ---");
            Field[] declaredFields = clz.getDeclaredFields();
            for (Field field : declaredFields) {
                System.out.println(field.getName());
            }
            System.out.println("--- etDeclaredFields end ---");

    獲取類中的構(gòu)造方法

    通過(guò)getConstructors和getDeclaredConstructors的方法,可以獲取類中的構(gòu)造方法信息,其中g(shù)etConstructors可以獲取類中構(gòu)造方法,而getDeclaredConstructors的方法,獲取所有類中的構(gòu)造方法,但是無(wú)法獲取到父類的構(gòu)造方法信息。格式如下:

     System.out.println("--- getConstructors start ---");
            Constructor[] constructors = clz.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor.getName());
            }
            System.out.println("--- getConstructors end ---");
    
            System.out.println("---getDeclaredConstructors start---");
            Constructor[] declaredConstructors = clz.getDeclaredConstructors();
            for (Constructor constructor : declaredConstructors) {
                System.out.println(constructor.getName());
            }
            System.out.println("---getDeclaredConstructors end---");

    獲取類中方法

    通過(guò)getMethods和getDeclaredMethods的方法,可以獲取類中的構(gòu)造方法信息,其中g(shù)etMethods可以獲取類中構(gòu)造方法,而getDeclaredMethods的方法,獲取所有類中的方法,但是無(wú)法獲取到父類的方法信息。格式如下:

     System.out.println("--- getMethods start ---");
            Method[] methods = clz.getMethods();
            for (Method method : methods) {
                System.out.println(method.getName());
            }
            System.out.println("--- getMethods end ---");
    
    
            System.out.println("--- getDeclaredMethods start---");
            Method[] declaredMethods = clz.getDeclaredMethods();
            for (Method method : declaredMethods) {
                System.out.println(method.getName());
            }
            System.out.println("--- getDeclaredMethods end ---");

    關(guān)于“Java反射如何使用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI