Rumah  >  Artikel  >  Java  >  Cara menggunakan refleksi bahasa Java

Cara menggunakan refleksi bahasa Java

WBOY
WBOYasal
2023-06-10 18:58:151041semak imbas

Bahasa Java ialah bahasa pengaturcaraan berorientasikan objek, yang mempunyai kelebihan platform merentas yang baik dan penyelenggaraan yang mudah. Mekanisme refleksi bahasa Java ialah ciri penting bahasa Java Ia membolehkan program memperoleh maklumat secara dinamik tentang kelas tertentu pada masa jalan dan menggunakan kaedah dan atribut yang disediakan oleh kelas, dengan itu meningkatkan kebolehskalaan dan fleksibiliti program. Artikel ini akan memperkenalkan penggunaan refleksi bahasa Java.

Mekanisme pantulan ialah mekanisme dinamik dalam bahasa Java, yang membolehkan pengaturcara mendapatkan maklumat kelas secara dinamik semasa menulis kod, termasuk pembina kelas, kaedah dan sifat, dsb. Mekanisme refleksi bahasa Java terutamanya terdiri daripada tiga kelas: Kelas, Pembina dan Kaedah. Antaranya, Kelas mewakili jenis kelas, Pembina mewakili pembina kelas, dan Kaedah mewakili kaedah kelas.

Melalui objek kelas Kelas, kita boleh mendapatkan maklumat lengkap kelas, termasuk nama kelas, kelas induk, antara muka, kaedah pembina, kaedah ahli, atribut ahli, anotasi, dsb. Contohnya, kod berikut menunjukkan mendapatkan nama kelas dan nama kelas induk bagi sesebuah kelas:

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        Class<Person> pClass = Person.class;
        System.out.println("类名:" + pClass.getName());
        System.out.println("父类名:" + pClass.getSuperclass().getName());
    }
}

Dalam kod di atas, kami memperoleh jenis Person.class kelas Orang melalui Class, dan kemudian gunakan mendapat nama kelas, dan kaedah getName() mendapat kelas induk kelas, akhirnya mengeluarkan nama kelas dan nama kelas induk. getSuperClass()

Selain mendapatkan nama kelas dan nama kelas induk, kami juga boleh mendapatkan maklumat tentang kelas lain melalui refleksi, seperti mendapatkan pembina kelas, kaedah ahli, atribut ahli, dll. Kod berikut menunjukkan cara untuk dapatkan Pembina kelas Orang, pembolehubah ahli dan kaedah ahli, dan panggil mereka melalui refleksi:

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public void sayHello() {
        System.out.println("Hello, my name is " + name);
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<Person> pClass = Person.class;
        // 获取所有构造器
        Constructor<?>[] constructors = pClass.getDeclaredConstructors();
        // 获取指定的构造器
        Constructor<?> constructor = pClass.getDeclaredConstructor(String.class, int.class);
        // 新建对象
        Person person = (Person) constructor.newInstance("Tom", 20);
        // 获取所有成员变量
        Field[] fields = pClass.getDeclaredFields();
        // 获取指定的成员变量
        Field field = pClass.getDeclaredField("name");
        // 修改成员变量的值
        field.setAccessible(true);
        field.set(person, "Jerry");
        // 获取所有成员方法
        Method[] methods = pClass.getDeclaredMethods();
        // 获取指定的成员方法
        Method method = pClass.getDeclaredMethod("sayHello");
        // 调用成员方法
        method.invoke(person);
    }
}

Dalam kod di atas, kami menggunakan kaedah

untuk mendapatkan semua pembina kelas Orang, dan kemudian gunakan getDeclaredConstructors() untuk mendapatkan Pergi ke pembina yang ditetapkan dan gunakan kaedah getDeclaredConstructor(String.class, int.class) untuk mencipta objek baharu. Seterusnya, kami menggunakan kaedah newInstance() untuk mendapatkan semua pembolehubah ahli kelas Orang, gunakan kaedah getDeclaredFields() untuk mendapatkan pembolehubah ahli yang ditentukan dan gunakan kaedah getDeclaredField("name") untuk memanggil pembolehubah ahli persendirian. Akhir sekali, kami menggunakan kaedah setAccessible(true) untuk mendapatkan semua kaedah ahli kelas Orang, gunakan kaedah getDeclaredMethods() untuk mendapatkan kaedah ahli yang ditentukan, dan gunakan kaedah getDeclaredMethod("sayHello") untuk memanggil kaedah ahli. invoke()

Apabila menggunakan mekanisme pantulan, anda perlu memberi perhatian kepada perkara berikut:

    Prestasi mekanisme pantulan adalah lebih rendah kerana ia perlu mendapatkan maklumat kelas pada masa jalan, yang mana tidak diperlukan pada masa penyusunan Maklumat telah ditentukan, jadi mekanisme refleksi harus dielakkan jika boleh.
  1. Mekanisme refleksi boleh mengakses dan mengubah suai sifat persendirian dan kaedah persendirian kelas, yang memecahkan enkapsulasi kelas dan harus digunakan dengan berhati-hati untuk mengelakkan kesan buruk.
  2. Mekanisme refleksi perlu mengendalikan pengecualian, seperti NoSuchMethodException, IllegalAccessException, dll., jadi anda harus memberi perhatian kepada pengendalian pengecualian apabila menggunakan mekanisme refleksi.
Ringkasnya, mekanisme pantulan bahasa Java adalah ciri yang sangat penting Ia membolehkan program memperoleh maklumat kelas secara dinamik dan menggunakan kaedah dan atribut kelas, meningkatkan skalabiliti dan fleksibiliti. program seks. Apabila menggunakan mekanisme pantulan, anda perlu memberi perhatian kepada isu seperti prestasi, enkapsulasi dan pengendalian pengecualian untuk memastikan kualiti dan kebolehpercayaan kod.

Atas ialah kandungan terperinci Cara menggunakan refleksi bahasa Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn