Rumah  >  Artikel  >  Java  >  Apakah maksud dan peranan refleksi di Jawa?

Apakah maksud dan peranan refleksi di Jawa?

WBOY
WBOYke hadapan
2023-04-21 15:16:081410semak imbas

1. Gambaran keseluruhan refleksi

Refleksi (refleksi) adalah kunci untuk dianggap sebagai bahasa dinamik Mekanisme refleksi membolehkan program mendapatkan maklumat dalaman mana-mana kelas dengan bantuan API Refleksi semasa pelaksanaan, dan boleh mengendalikan sebarang objek dan kaedah dalaman secara langsung. Selepas kelas dimuatkan, objek jenis Kelas dijana dalam kawasan kaedah memori timbunan (kelas hanya mempunyai satu objek Kelas Objek ini mengandungi maklumat struktur kelas yang lengkap). Kita boleh melihat struktur kelas melalui objek ini. Objek ini adalah seperti cermin.

2. API yang biasa digunakan

java.lang.Class: mewakili kelas

java.lang.reflect.Method: mewakili kaedah kelas

java.lang.reflect.Field: mewakili pembolehubah Ahli kelas

java.lang.reflect.Constructor: Mewakili pembina kelas

static Class forName(String name)  Mengembalikan objek Kelas bagi nama kelas yang ditentukan

Object newInstance() Memanggil pembina tanpa parameter dan mengembalikan Contoh objek Kelas

getName() Mengembalikan nama entiti (kelas, antara muka, kelas tatasusunan, jenis asas atau tidak sah) yang diwakili oleh objek Kelas ini

Class getSuperClass() Mengembalikan objek Kelas semasa Objek Kelas kelas induk

Class [] getInterfaces() Mendapat antara muka objek Kelas semasa

ClassLoader getClassLoader()  Mengembalikan pemuat kelas kelas

Class getSuperclass() Mengembalikan perwakilan Kelas Kelas ini

Constructor[] getConstructors() kelas super entiti yang diwakili Mengembalikan tatasusunan yang mengandungi beberapa objek Pembina

Field[] getDeclaredFields() Mengembalikan tatasusunan Kaedah objek medan

getMethod(String name,Class … paramTypes) Mengembalikan objek Kaedah Jenis parameter formal objek ini ialah paramType

Contoh:

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 +
            '}';
    }
}

Refleksi

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());
        }
    }
}

3. Empat cara untuk mencipta objek Kelas Cara

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");
    }
}

Atas ialah kandungan terperinci Apakah maksud dan peranan refleksi di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam