Maison  >  Article  >  Java  >  Explication détaillée du mécanisme de réflexion en Java

Explication détaillée du mécanisme de réflexion en Java

黄舟
黄舟original
2017-10-16 10:19:261184parcourir

Cet article présente principalement des informations pertinentes sur le mécanisme de réflexion Java. J'espère que cet article pourra aider tout le monde à comprendre et à maîtriser le mécanisme de réflexion. Les amis dans le besoin peuvent se référer à

Java Explication détaillée d'exemples de réflexion. mécanisme

Préface

Aujourd'hui, je vais présenter le mécanisme de réflexion de Java Dans le passé, nous utilisions new pour obtenir une instance d'une classe. . L'exemple sort. C'est trop bas. Venez avec moi aujourd'hui pour apprendre une manière plus avancée d'y parvenir.

Texte

Définition du mécanisme de réflexion Java

Le mécanisme de réflexion Java signifie qu'à l'état d'exécution, pour n'importe quelle classe, il peut être connu Toutes les propriétés et méthodes de cette classe ; pour n'importe quel objet, n'importe laquelle de ses méthodes et propriétés peut être appelée ; cette fonction d'obtention dynamique d'informations et d'appel dynamique des méthodes de l'objet est appelée le mécanisme de réflexion du langage Java. Pour résumer en une phrase, la réflexion peut réaliser les propriétés et les méthodes de n'importe quelle classe au moment de l'exécution.

Les avantages et inconvénients du mécanisme de réflexion

Pourquoi utiliser le mécanisme de réflexion ? Ne suffit-il pas de créer des objets directement ? Cela implique les concepts de dynamique et de statique

Compilation statique : Déterminez le type au moment de la compilation et liez l'objet, c'est-à-dire passez.

Compilation dynamique : Déterminez le type et liez l'objet au moment de l'exécution. La compilation dynamique maximise la flexibilité de Java, incarne des applications polymorphes et réduit le couplage entre les classes.

Avantages

Il permet de réaliser une création dynamique d'objets et une compilation, ce qui reflète une grande flexibilité, notamment dans le développement de J2EE. Les performances sont très évidentes. Par exemple, pour un logiciel à grande échelle, il est impossible de le concevoir parfaitement en une seule fois. Une fois le programme compilé et publié, lorsqu'on constate que certaines fonctions doivent être mises à jour, on ne peut pas demander à l'utilisateur de désinstaller les précédentes. un puis réinstallez-le. La nouvelle version, si tel est le cas, ce logiciel ne sera certainement pas utilisé par beaucoup de gens. S'il est statique, l'ensemble du programme doit être recompilé une fois pour réaliser la mise à jour de la fonction. S'il utilise le mécanisme de réflexion, il n'a pas besoin d'être désinstallé. Il suffit de le créer et de le compiler dynamiquement au moment de l'exécution pour réaliser la fonction.

Inconvénients

A un impact sur les performances. L'utilisation de la réflexion est essentiellement une opération interprétée dans laquelle nous pouvons indiquer à la JVM ce que nous voulons faire et qui répond à nos exigences. De telles opérations sont toujours plus lentes que la simple exécution directe de la même opération.

Comprendre la classe Class et le type de classe

Si vous souhaitez comprendre la réflexion, comprenez d'abord la classe Class, qui est la base de la mise en œuvre de la réflexion.

Une classe est un objet instance de la classe java.lang.Class, et Class est une classe de toutes les classes (il existe une classe nommée Class Pour les objets ordinaires, nous créons et représentons généralement). eux aiment ceci :


Code code1 = new Code();

Comme mentionné ci-dessus, toutes les classes sont des objets de Class, alors comment l'exprimer Peut-il être exprimé de la manière suivante :


Class c = new Class();

Mais quand on regarde le code source de Class, il s'écrit ainsi :


private Class(ClassLoader loader) { 
classLoader = loader; 
}

Vous pouvez voir que le constructeur est privé. Seule la JVM peut créer des objets Class, nous ne pouvons donc pas créer un nouvel objet Class comme une classe normale. Bien que nous ne puissions pas créer un nouvel objet Class, nous pouvons obtenir un objet Class via une classe existante. . Il existe trois manières, comme suit :


Class c1 = Code.class;

Cela montre que toute classe a une classe de variable membre statique implicite. Cette méthode est obtenue en obtenant la variable membre statique. la classe de la classe


Class c2 = code1.getClass();

code1 est un objet de Code, qui est obtenu via la méthode getClass() d'un objet de classe


Class c3 = Class.forName(“com.trigl.reflect.Code”);

Cette méthode est que la classe Class appelle la méthode forName, qui est obtenue via le nom complet d'une classe. Ici, c1, c2 et c3 sont tous. objets de classe Ils sont exactement les mêmes, et il existe un nom scientifique appelé type de classe Code. C'est étrange. N'avons-nous pas dit que Code est un objet de classe et que c1, c2 et c3 sont également des objets de classe, donc le code n'est-il pas identique à c1, c2 et c3 ? Pourquoi s’appelle-t-on aussi Code et quel type de cours ? Ne vous souciez pas de savoir s'ils sont identiques ici, comprenez simplement ce que fait le type de classe. Comme son nom l'indique, le type de classe est le type de la classe, c'est-à-dire qu'il décrit ce qu'est une classe et ce qu'elle contient. , nous pouvons donc connaître une classe via les propriétés et les méthodes de la classe, et vous pouvez appeler les propriétés et les méthodes d'une classe. C'est la base de la réflexion.

Un exemple de code simple :


public class ReflectDemo { 
public static void main(String[] args) throws ClassNotFoundException { 
//第一种:Class c1 = Code.class; 
Class class1=ReflectDemo.class; 
System.out.println(class1.getName());

  //第二种:Class c2 = code1.getClass();
  ReflectDemo demo2= new ReflectDemo();
  Class c2 = demo2.getClass();
  System.out.println(c2.getName());

  //第三种:Class c3 = Class.forName("com.trigl.reflect.Code");
  Class class3 = Class.forName("com.tengj.reflect.ReflectDemo");
  System.out.println(class3.getName());
}
}

Résultat de l'exécution :


com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo

Opérations liées à la réflexion Java

Nous savions comment obtenir la classe plus tôt, alors que pouvons-nous faire avec cette classe ?

Le résumé est le suivant :

Obtenir la méthode membre Méthode
Obtenir la variable membre Field
Obtenir le constructeur Constructeur

Ce qui suit le présentera en détail

Obtention des informations sur la méthode membre

L'obtention d'une certaine méthode individuellement est obtenue via la méthode suivante de la classe Class :


public Method getDeclaredMethod(String name, Class c){

}

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:
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