首頁  >  文章  >  Java  >  Java中反射的意義和作用是什麼?

Java中反射的意義和作用是什麼?

WBOY
WBOY轉載
2023-04-21 15:16:081442瀏覽

一、反射概述

Reflection(反射)是被視為動態語言的關鍵,反射機制允許程式在執行期借助於Reflection API取得任何類別的內部信息,並能直接操作任意對象的內部屬性及方法。載入完類別之後,在堆記憶體的方法區中就產生了一個Class類型的物件 (一個類別只有一個Class物件),這個物件就包含了完整的類別的結構信 息。我們可以透過這個物件看到類別的結構,這個物件就像一面鏡子,透過這個鏡子看到類別的結構,所以我們形象的稱之為反射。

二、常用api

java.lang.Class:代表一個類別

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

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

java.lang.reflect.Constructor:代表類別的建構器

static Class forName(String name) 傳回指定類別名稱name 的Class 物件

Object newInstance() 呼叫無參建構函數,傳回該Class物件的實例

getName() 傳回此Class物件所表示的實體(類別、 介面、陣列類別、基本型別或void)名稱

Class getSuperClass() 傳回目前Class物件的父類別的Class物件

Class [] getInterfaces() 取得目前Class物件的介面

ClassLoader getClassLoader() 傳回該類別的類別載入器

Class getSuperclass() 傳回表示此Class所表示的實體的超類別的Class

#Constructor[] getConstructors() 傳回一個包含某些Constructor物件的陣列

Field[] getDeclaredFields() 傳回Field物件的一個陣列Method

getMethod(String name,Class … paramTypes) 傳回一個Method對象,此物件的形參類型為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. 创建Class对象
        //Class<Person> clazz = (Class<Person>)
        Class.forName("Person");
        Class<?> clazz =Class.forName("Person");
            // 2. 通过Class对象调用其方法
            // 2.1. 通过反射来实例化对象
            //Person person = clazz.newInstance();
            Object o = clazz.newInstance(); // 此名就相当于
        Person p = new Person()
            // 2.2. 获取类的完整类名称(包名+类名)
            String name = clazz.getName();
        System.out.println(name);
        // 2.3. 获取类的简单名称,就是类的名称,不含包名
        System.out.println(clazz.getSimpleName());
        // 2.4. 获取构造器
        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());
        }
    }
}
三、創建Class物件的四種方式

public class Demo {
    public static void main(String[] args) throws
        Exception {
        // 第一种方式:调用Class.forName()
        Class clazz =Class.forName("java.lang.String");
        // 第二种方式:通过类的字节码文件来创建
        Class clazz1 = String.class;
        // 第三种方式:通过调用对象的getClass()方法来创建
        String str = new String();
        Class clazz2 = str.getClass();
        // 第四种:通过类装载器来创建
        ClassLoader loader =String.class.getClassLoader();
        Class<?> clazz3 =loader.loadClass("java.lang.String");
    }
}

以上是Java中反射的意義和作用是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除