Maison  >  Article  >  Java  >  Quel est le sens et le rôle de la réflexion en Java ?

Quel est le sens et le rôle de la réflexion en Java ?

WBOY
WBOYavant
2023-04-21 15:16:081441parcourir

1. Présentation de la réflexion

La réflexion (réflexion) est la clé pour être considéré comme un langage dynamique. Le mécanisme de réflexion permet au programme d'obtenir les informations internes de n'importe quelle classe à l'aide de l'API Reflection pendant l'exécution, et peut directement exploiter les propriétés et méthodes internes de n’importe quel objet. Une fois la classe chargée, un objet de type Class est généré dans la zone méthode de la mémoire tas (une classe n'a qu'un seul objet Class. Cet objet contient les informations structurelles complètes de la classe). Nous pouvons voir la structure de la classe à travers cet objet. Cet objet est comme un miroir. Nous pouvons voir la structure de la classe à travers ce miroir, c'est pourquoi nous l'appelons clairement réflexion.

2. API couramment utilisées

java.lang.Class : représente une classejava.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) 

java.lang.reflect.Method : représente la méthode de la classe

java.lang.reflect.Field : Représente les variables membres de la classe

java.lang.reflect.Constructor : Représente le constructeur de la classe

static Class forName(String name ) Renvoie l'objet Class avec le nom de classe spécifié 🎜🎜Object newInstance() Appelle le constructeur sans argument et renvoie une instance de l'objet Class 🎜🎜getName() Renvoie le nom de l'entité (classe, interface, classe tableau, type de base ou vide) représentée par cet objet Class🎜🎜Class getSuperClass() Renvoie l'objet Class de la classe parent de l'objet Class actuel🎜🎜Class [] getInterfaces() Obtient l'interface de l'objet Class actuel🎜🎜ClassLoader getClassLoader() Renvoie le chargeur de classe de la classe🎜🎜Class getSuperclass() Renvoie la Classe représentant la superclasse de l'entité représentée par cette Classe🎜🎜Constructor[] getConstructors() Renvoie un tableau contenant quelques objets Constructeur 🎜🎜Field[] getDeclaredFields() code> Renvoie un tableau d'objets Field Method🎜🎜getMethod(String name,Class ... paramTypes) Renvoie un objet Method, le Le type de paramètre formel de cet objet est paramType🎜🎜Exemple : 🎜
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 +
            '}';
    }
}
🎜Reflection🎜
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());
        }
    }
}
🎜Quatre façons de créer des objets de classe🎜
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");
    }
}
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer