Maison >Java >javaDidacticiel >Exemple de partage de code sur le mécanisme de réflexion en Java (image)

Exemple de partage de code sur le mécanisme de réflexion en Java (image)

黄舟
黄舟original
2017-06-18 10:08:051236parcourir

Cet article présente principalement des informations pertinentes sur l'explication détaillée du mécanisme de réflexion en Java. Les amis qui en ont besoin peuvent se référer à

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

.

Réflexion, je les ai souvent entendus dire que j'avais lu certaines informations et que je les avais peut-être utilisées dans Design Pattern, mais j'avais l'impression de ne pas les comprendre en profondeur, je les ai étudiées. encore cette fois et ça allait.

Tout d'abord, jetons un coup d'œil au concept de réflexion :

Désigne principalement la capacité d'un programme à accéder, détecter et modifier son propre statut ou comportement, et peut L'état et les résultats de son propre comportement, en ajustant ou en modifiant l'état et la sémantique associée du comportement décrit par l'application.

Reflection est un outil puissant en Java qui nous permet de créer facilement du code flexible qui peut être assemblé au moment de l'exécution sans avoir besoin de relier le code source entre les composants. Mais une mauvaise utilisation de la réflexion peut coûter très cher !

Si le concept vous déroute, continuez à lire.

2. Le rôle du mécanisme de réflexion :

1.Décompiler : .class-->.java

2. mécanisme de réflexion Attributs d'objet Java, méthodes, méthodes de construction , etc.;

semble être plus facile à comprendre. Voyons comment implémenter ces fonctions en détail.

Troisièmement, examinons les classes du mécanisme de réflexion que le soleil nous offre :


java.lang.Class;        

java.lang.reflect.Constructor; java.lang.reflect.Field;    

java.lang.reflect.Method;

java.lang.reflect.Modifier;

Beaucoup Nous pouvons interroger des méthodes, des propriétés et d’autres opérations en réflexion à partir de ces quatre classes. Ou devrions-nous apprendre à interroger constamment l’API, c’est notre meilleur professeur.

Quatre. Implémentation de fonctions spécifiques :

1 Il existe trois façons d'obtenir des classes via le mécanisme de réflexion. Obtenons le type Employé

<.>

//第一种方式:
Classc1 = Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class;
 
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
2,

Créer un objet : Après avoir obtenu la classe, nous créons son objet, en utilisant newInstance :


   Class c =Class.forName("Employee");
 
      //创建此Class 对象所表示的类的一个新实例
      Objecto = c.newInstance(); //调用了Employee的无参数构造方法.
3, Obtenir les attributs : divisé en tous les attributs et attributs spécifiés :

a, regardez d'abord comment obtenir tous les attributs :


//获取整个类
  Class c = Class.forName("java.lang.Integer");
    //获取所有的属性?
  Field[] fs = c.getDeclaredFields();
 
        //定义可变长的字符串,用来存储属性
  StringBuffer sb = new StringBuffer();
     //通过追加的方法,将每个属性拼接到此字符串中
  //最外边的public定义
  sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
     //里边的每一个属性
  for(Field field:fs){
  sb.append("\t");//空格
  sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
  sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
  sb.append(field.getName()+";\n");//属性的名字+回车
  }
 
  sb.append("}");
 
  System.out.println(sb);
b , obtenez des attributs spécifiques et apprenez par rapport aux méthodes traditionnelles :


public static void main(String[] args) throws Exception{
  
<span style="white-space:pre"> </span>//以前的方式:
 /*
 User u = new User();
 u.age = 12; //set
 System.out.println(u.age); //get
 */
  
 //获取类
 Class c = Class.forName("User");
 //获取id属性
 Field idF = c.getDeclaredField("id");
 //实例化这个类赋给o
 Object o = c.newInstance();
 //打破封装
 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
 //给o对象的id属性赋值"110"
 idF.set(o, "110"); //set
 //get
 System.out.println(idF.get(o));
}
4 La méthode d'acquisition et la méthode de construction ne seront pas décrites en détail, prenez simplement un. regardez. Mots-clés :

De cette façon, nous pouvons obtenir divers contenus de la classe et la décompiler. Pour un langage comme JAVA qui compile d'abord puis s'exécute, le mécanisme de réflexion peut rendre le code plus flexible et plus facile à implémenter

orienté objet.

Cinquièmement, réflexion plus fichier de configuration rend notre programme plus flexible :

Lors de l'apprentissage des modèles de conception, lors de l'apprentissage de l'usine abstraite, la réflexion a été utilisée pour plus lire facilement les chaînes de connexion à la base de données, etc. Je ne l'ai pas bien compris à l'époque, alors je l'ai simplement copié. Jetez un œil à l'utilisation des fichiers de configuration réflexion + dans .NET :

Le fichier de configuration utilisé à cette époque était le fichier app.config, le contenu était au format XML et le contenu de la base de données de liens était rempli :


   <configuration>
  <appSettings>
  <add   key="" value=""/>
  </appSettings>
      </configuration>
Rédaction de réflexion :


 assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);
Cet avantage est que c'est très simple et pratique pour nous de transformer la base de données. Par exemple, nous utiliserons le système. Si la base de données est mise à niveau de SQL Server vers Oracle, nous écrivons deux couches D, modifions le contenu du fichier de configuration ou ajoutons des conditions pour le sélectionner, ce qui apporte une grande commodité.

Bien sûr, la même chose est vraie en JAVA, sauf que le fichier de configuration ici est .properties, qui est appelé fichier de propriétés. Lisez le contenu à l’intérieur par réflexion. De cette façon, le code est fixe, mais nous pouvons modifier le contenu du fichier de configuration, ce qui rend notre code beaucoup plus flexible !

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