溫馨提示×

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

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

java中反射的含義是什么

發(fā)布時(shí)間:2022-05-19 11:50:27 來源:億速云 閱讀:155 作者:iii 欄目:大數(shù)據(jù)

本文小編為大家詳細(xì)介紹“java中反射的含義是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“java中反射的含義是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

一、反射概述

Reflection(反射)是被視為動(dòng)態(tài)語(yǔ)言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflection API取得任何類的內(nèi)部信息,并能直接操作任意 對(duì)象的內(nèi)部屬性及方法。 加載完類之后,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個(gè)Class類型的對(duì)象 (一個(gè)類只有一個(gè)Class對(duì)象),這個(gè)對(duì)象就包含了完整的類的結(jié)構(gòu)信 息。我們可以通過這個(gè)對(duì)象看到類的結(jié)構(gòu),這個(gè)對(duì)象就像一面鏡子,透 過這個(gè)鏡子看到類的結(jié)構(gòu),所以我們形象的稱之為反射。

二、常用api

java.lang.Class:代表一個(gè)類

java.lang.reflect.Method:代表類的方法

java.lang.reflect.Field:代表類的成員變量

java.lang.reflect.Constructor:代表類的構(gòu)造器

static Class forName(String name) 返回指定類名 name 的 Class 對(duì)象

Object newInstance() 調(diào)用無(wú)參構(gòu)造函數(shù),返回該Class對(duì)象 的一個(gè)實(shí)例

getName() 返回此Class對(duì)象所表示的實(shí)體(類、 接口、數(shù)組類、基本類型或void)名稱

Class getSuperClass() 返回當(dāng)前Class對(duì)象的父類的Class對(duì)象

Class [] getInterfaces() 獲取當(dāng)前Class對(duì)象的接口

ClassLoader getClassLoader() 返回該類的類加載器

Class getSuperclass() 返回表示此Class所表示的實(shí)體的超類的Class

Constructor[] getConstructors() 返回一個(gè)包含某些Constructor對(duì)象的數(shù)組

Field[] getDeclaredFields() 返回Field對(duì)象的一個(gè)數(shù)組 Method

getMethod(String name,Class … paramTypes) 返回一個(gè)Method對(duì)象,此對(duì)象的形參類型為paramType

示例:

public class Person {
    private String name;
    private int age;
    public Person() {
        System.out.println("Person類被初始化了。。。。。^_^");
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

反射

public class ClassDemo {
    public static void main(String[] args) throws
        Exception {
        // 1. 創(chuàng)建Class對(duì)象
        //Class<Person> clazz = (Class<Person>)
        Class.forName("Person");
        Class<?> clazz =Class.forName("Person");
            // 2. 通過Class對(duì)象調(diào)用其方法
            // 2.1. 通過反射來實(shí)例化對(duì)象
            //Person person = clazz.newInstance();
            Object o = clazz.newInstance(); // 此名就相當(dāng)于
        Person p = new Person()
            // 2.2. 獲取類的完整類名稱(包名+類名)
            String name = clazz.getName();
        System.out.println(name);
        // 2.3. 獲取類的簡(jiǎn)單名稱,就是類的名稱,不含包名
        System.out.println(clazz.getSimpleName());
        // 2.4. 獲取構(gòu)造器
        Constructor<?>[] constructors =
            clazz.getConstructors();
        for (Constructor<?> constructor :
             constructors) {
            System.out.println(constructor.getName());
        }
        // 2.5. 獲取字段
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }
        // 2.6. 獲取方法
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    }
}

三、創(chuàng)建Class對(duì)象的四種方式

public class Demo {
    public static void main(String[] args) throws
        Exception {
        // 第一種方式:調(diào)用Class.forName()
        Class clazz =Class.forName("java.lang.String");
        // 第二種方式:通過類的字節(jié)碼文件來創(chuàng)建
        Class clazz1 = String.class;
        // 第三種方式:通過調(diào)用對(duì)象的getClass()方法來創(chuàng)建
        String str = new String();
        Class clazz2 = str.getClass();
        // 第四種:通過類裝載器來創(chuàng)建
        ClassLoader loader =String.class.getClassLoader();
        Class<?> clazz3 =loader.loadClass("java.lang.String");
    }
}

讀到這里,這篇“java中反射的含義是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(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