Maison > Java > JavaBase > Qu'est-ce que la réflexion en Java ?

Qu'est-ce que la réflexion en Java ?

angryTom
Libérer: 2019-11-11 10:04:08
original
5615 Les gens l'ont consulté

Qu'est-ce que la réflexion en Java ?

Qu'est-ce que la réflexion ?

Désigne principalement la capacité d'un programme à accéder, détecter et modifier son propre statut ou comportement.

Qu'est-ce que la réflexion Java ?

La réflexion Java signifie que dans l'état d'exécution du programme Java, pour n'importe quelle classe, toutes les propriétés et méthodes de cette classe peuvent être obtenues pour un objet donné, toutes les propriétés et méthodes peuvent être obtenues ; être appelé N'importe laquelle de ses propriétés et méthodes. Cette méthode d'obtention dynamique du contenu d'une classe et d'appel dynamique d'objets est appelée mécanisme de réflexion.

Le mécanisme de réflexion Java fournit principalement les fonctions suivantes :

* 1. Déterminer la classe à laquelle appartient tout objet au moment de l'exécution.

* 2. Construisez un objet de n'importe quelle classe au moment de l'exécution.

* 3. Déterminez les variables membres et les méthodes de n'importe quelle classe au moment de l'exécution.

* 4. Appelez la méthode de n'importe quel objet au moment de l'exécution.

Le mécanisme de réflexion de Java est principalement utilisé pour analyser les capacités des classes. Nous pouvons obtenir des informations sur les membres et les membres de chaque type dans un programme ou un assembly au moment de l'exécution. Les types d'objets généraux du programme sont confirmés lors de la compilation. Le mécanisme de réflexion de Java peut créer dynamiquement des objets et appeler leurs propriétés pendant l'exécution. Par conséquent, le cœur de la réflexion consiste à charger dynamiquement des classes ou à appeler des méthodes pour accéder aux propriétés pendant l'exécution. Il n'est pas nécessaire de savoir à l'avance qui est l'objet en cours d'exécution.

La réflexion peut être utilisée pour :

Construire un objet de n'importe quelle classe pendant l'exécution. Déterminer la classe à laquelle appartient un objet/s'il s'agit d'une instance d'un certain. classe pendant l'exécution. Obtenez les propriétés et les méthodes de n'importe quelle classe, y compris les méthodes publiques héritées qui appellent les méthodes de n'importe quel objet pendant l'exécution.

Exemple :

a) Méthode Get

La classe de routine DumpMethods démontre le rôle de base de l'API Reflection, qui lit les paramètres de ligne de commande spécifiés nom de la classe, puis imprime les informations sur la méthode de cette classe. ​

import java.lang.reflect.Method;
 
public class DumpMethods
{
    public static void main(String[] args) throws Exception //在方法后加上这句,异常就消失了
    {
        //获得字符串所标识的类的class对象
        Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0]
 
        //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法)
        Method[] methods = classType.getDeclaredMethods();
 
        //遍历输出所有方法声明
        for(Method method : methods)
        {
            System.out.println(method);
        }
    }
 
}
Copier après la connexion

b) Méthode d'appel par réflexion

import java.lang.reflect.Method;
 
public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
 
    }
 
    public String echo(String message)
    {
        return "Hello: " + message;
    }
 
    public static void main(String[] args) throws Exception
    {
 
        // 以前的常规执行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1, 2));
        System.out.println(tester.echo("Tom"));
        System.out.println("---------------------------");
 
        // 通过反射的方式
 
        // 第一步,获取Class对象
        // 前面用的方法是:Class.forName()方法获取
        // 这里用第二种方法,类名.class
        Class<?> classType = InvokeTester.class;
 
        // 生成新的对象:用newInstance()方法
        Object invokeTester = classType.newInstance();
        System.out.println(invokeTester instanceof InvokeTester); // 输出true
 
        // 通过反射调用方法
        // 首先需要获得与该方法对应的Method对象
        Method addMethod = classType.getMethod("add", new Class[] { int.class,
                int.class });
        // 第一个参数是方法名,第二个参数是这个方法所需要的参数的Class对象的数组
 
        // 调用目标方法
        Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 });
        System.out.println(result); // 此时result是Integer类型
 
        //调用第二个方法
        Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class});
        Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
        System.out.println(result2);
 
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal