English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explication détaillée de la réflexion en Java

Sommaire de la lecture

  1. API de réflexion Java
  2. Créer une instance d'objet par reflection
  3. Appel de méthode privée via la réflexion
  4. À propos de l'outil javap
  5. Références

API de réflexion Java

Réflexion JavaIl s'agit du processus de pouvoir obtenir les attributs et méthodes d'une classe ou de modifier le comportement d'une classe au moment de l'exécution.

Classe java.lang.ClassIl fournit de nombreuses méthodes pour obtenir des métadonnées, vérifier et modifier le comportement des classes au moment de l'exécution.

La réflexion en Java implique principalement les classes sous les packages java.lang et java.lang.reflect.

Exemples de scénarios d'application de la réflexion

  1. IDE, tels que Eclipse, MyEclipse, NetBeans et autres ;
  2. Débogueurs;
  3. Outils de test, etc.
  4. Différents cadres, tels que Spring, Hibernate, etc.

Classe java.lang.Class

La classe java.lang.Class offre principalement deux fonctions :

  1. Fournit des méthodes pour accéder aux métadonnées de la classe pendant l'exécution;
  2. Fournit des méthodes pour vérifier et modifier le comportement d'exécution de la classe à runtime;

Méthodes couramment utilisées de la classe java.lang.Class

Méthode Description
1) public String getName() Retourne le nom de la classe
2) public static Class forName(String className) throws ClassNotFoundException Charger la classe et retourner l'objet Class
3) public Object newInstance() throws InstantiationException, IllegalAccessException Créer un objet instance
4) public boolean isInterface() Jugement s'il s'agit d'une interface
5) public boolean isArray() Jugement s'il s'agit d'un tableau
6) public boolean isPrimitive() Jugement s'il s'agit d'un type de données primaires
7) public Class getSuperclass() Retourne une référence Class de la classe parente
8) public Field[] getDeclaredFields() throws SecurityException Retourne le tableau des champs de propriété membres de la classe
9) public Method[] getDeclaredMethods() throws SecurityException Retourne le tableau des méthodes de la classe
10) public Constructor[] getDeclaredConstructors() throws SecurityException Retourne le tableau des constructeurs de la classe
11) public Method getDeclaredMethod(String name, Class[] parameterTypes) throws NoSuchMethodException, SecurityException Retourne la méthode spécifique du type de paramètre de la classe

Comment obtenir l'objet Class

Il y a trois méthodes, telles que :

  1. La méthode forName() de la classe Class, charge dynamiquement, au moment de l'exécution, commence à charger la classe et effectue l'initialisation statique de la classe
  2. 对象的getClass()方法,静态加载(编译时已加载)
  3. .class语法, 静态加载(编译时已加载)

méthode getClass() de l'objet, chargement statique (chargé au moment de la compilation)}

.class syntaxe, chargement statique (chargé au moment de la compilation)

package tmp;
class Simple
{
}
public class Test
{
 forName() méthode exemple
 {
 try63Class<&#
 Agit sur le nom de la classe, et peut également être appliqué aux types de données primitives, comme suit :
 Simple s = new Simple();
 }
}
; extends Object> c = s.getClass();
System.out.println(c.getSimpleName());

Peut être utilisé pour le chargement dynamique, lorsque vous connaissez le nom complet de la classe. Notez que les types de données primitives ne sont pas applicables à cette méthode ;

public static void main(String args[]) throws ClassNotFoundException

package tmp;
class Simple
{
}
public class Test
{
 getClass() méthode exemple :
 {
 }
 public static void main(String args[])
 {
 Obtenir l'objet Class à partir de l'objet d'instance
 try63void printName(Object obj)
 Agit sur le nom de la classe, et peut également être appliqué aux types de données primitives, comme suit :
 Simple s = new Simple();
 }
}
; extends Object> c = s.getClass();
System.out.println(c.getSimpleName());

tmp.Simple

Simple

package tmp;
public class Test
{
 public static void main(String args[])
 {
 .class syntaxe exemple
 Agit sur le nom de la classe, et peut également être appliqué aux types de données primitives, comme suit :
 Class<Boolean> c = boolean.class;2 System.out.println(c.getName());
 System.out.println(c2Class<Test> c
 }
}
= Test.class;
.getName());

boolean

tmp.Test

1Déterminer le type de l'objet Class Les méthodes suivantes peuvent être utilisées pour déterminer le type de l'objet Class :
2) public boolean isInterface(): ) public boolean isArray():
3) public boolean isPrimitive(): Correspondre-t-il au type de données original

Exemple de code :

package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
 public static void main(String args[])
 {
 this.msg = s;
 {
 try63Class<&#
 System.out.println(c.isInterface());
 try63;> c2 = Class.forName("tmp.My");
 System.out.println(c2);
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}
false
true

Créer une instance d'objet par reflection

Il y a deux méthodes, telles que :

  1. Créé par la méthode newInstance() de l'objet Class, cette méthode ne peut appeler que le constructeur sans paramètres ;
  2. Créé par la méthode newInstance() de l'objet Constructor, cette méthode est adaptée aux constructeurs avec paramètres et peut briser le modèle singleton, appeler le constructeur privé ;

所以,通常来讲,第二种方式比第一种使用范围更广。

Donc, généralement parlant, la deuxième méthode est plus large que la première en termes d'utilisation.

package tmp;
class Simple
{
 private String msg;
 {
 Exemple d'appel de la méthode newInstance() de l'objet Class
 }
}
public class Test
{
 public static void main(String args[])
 {
 this.msg = s;
 {
 try63Class<&#
 System.out.println("Hello Java");
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Simple s = (Simple) c.newInstance();

Hello Java

Exemple d'appel de la méthode newInstance() de l'objet Constructor

package tmp;
Attention, ici, vous pouvez obtenir la méthode de construction spécifique en fonction du type des paramètres传入, et vous pouvez également modifier les restrictions d'accès de la méthode de construction.
class Simple
{
 import java.lang.reflect.Constructor;
 private String msg;
 {
 void message() + System.out.println("Hello Java,"
 }
 msg);
 private Simple(String s){
 }
}
public class Test
{
 public static void main(String args[])
 {
 this.msg = s;
 {
 try63Class<&#
 ;> c = Class.forName("tmp.Simple");63;> con = c.getDeclaredConstructor(String.class);
 con.setAccessible(true);
 Simple s = (Simple) con.newInstance("...");
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java,...

Appel de méthode privée via la réflexion

Grâce à la réflexion, nous pouvons appeler les méthodes privées d'autres classes, principalement impliquant les classes java.lang.Class et java.lang.reflect.Method;

Il utilise principalement les méthodes setAccessible() et invoke() de la classe Method, la première modifie les permissions d'accès, et la seconde appelle la méthode.

Exemple d'appel d'une méthode privée avec des paramètres :

package tmp;
import java.lang.reflect.Method;
class A
{
 private void cube(int n)
 {
 System.out.println(n * n * n);
 }
}
class Test
{
 public static void main(String args[]) throws Exception
 {
 Class<A> c = A.class;
 Object obj = c.newInstance();
 Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
 m.setAccessible(true);
 m.invoke(obj, 4);
 }
}

À propos de l'outil javap

L'utilisation de la commande javap peut désassembler les fichiers bytecode Java, afficher les informations des champs, des attributs, des méthodes constructeurs et des méthodes normales du fichier class ;

Instructions d'utilisation :

Exemple javap java.lang.Object

javap -Exemple c Test :

Écrivez une classe Test simple, comme suit :

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[])
 {
 System.out.println("Hello");
 }
}

Entrez javap -c Test:

Références

Il s'agit principalement de traduction, avec quelques modifications mineures

http://www.javatpoint.com/java-réflexion

Voici la totalité du contenu de cet article, j'espère que le contenu de cet article peut apporter un certain aide à votre apprentissage ou à votre travail, et j'espère également que vous pouvez soutenir davantage le tutoriel de cri !

Déclaration : Le contenu de cet article est issu du réseau, propriété de ses auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet, ce site Web ne détient pas de propriété, n'a pas été traité par l'édition humaine et n'assume pas de responsabilité juridique. Si vous trouvez du contenu suspect de violation de copyright, vous êtes invité à envoyer un e-mail à : notice#w3Déclaration : Le contenu de cet article est issu du réseau, propriété de ses auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet, ce site Web ne détient pas de propriété, n'a pas été traité par l'édition humaine et n'assume pas de responsabilité juridique. Si vous trouvez du contenu suspect de violation de copyright, vous êtes invité à envoyer un e-mail à : notice#w

Vous pourriez aussi aimer