Maison  >  Article  >  Java  >  Points à noter sur le mécanisme de réflexion en Java

Points à noter sur le mécanisme de réflexion en Java

黄舟
黄舟original
2017-09-21 09:51:231608parcourir

Cet article présente principalement le contenu pertinent du mécanisme de réflexion Java, y compris le chargement dynamique des classes, l'obtention des variables membres, les informations sur le constructeur et d'autres informations. Les amis dans le besoin peuvent s'y référer.

Tout le monde sait que pour qu'un programme Java s'exécute, la classe Java doit être chargée par la machine virtuelle Java. Les classes Java ne peuvent pas s'exécuter normalement si elles ne sont pas chargées par la machine virtuelle Java. Désormais, tous les programmes que nous exécutons savent que la classe dont vous avez besoin a été chargée lors de la compilation.

Le mécanisme de réflexion de Java ne détermine pas quelle classe est chargée lors de la compilation, mais la charge, la détecte et l'auto-examine uniquement lorsque le programme est en cours d'exécution. Utilisez des classes qui ne sont pas connues au moment de la compilation. Une telle caractéristique est la réflexion.

Le mécanisme de réflexion est qu'à l'état d'exécution, pour n'importe quelle classe, vous pouvez connaître toutes les propriétés et méthodes de cette classe ; pour n'importe quel objet, vous pouvez appeler n'importe laquelle de ses méthodes et propriétés ; les informations et la fonction d'appel dynamique des méthodes de l'objet sont appelées le mécanisme de réflexion du langage Java.

Cet article présentera la connaissance de la réflexion sous les aspects suivants :

Calss utilisation réflexion constructeur réflexion membre variable réflexion

1. Qu'est-ce qu'une classe

Dans le monde orienté objet, tout est un objet. Les classes sont des objets et les classes sont des objets d'instance de la classe java.lang.Class. De plus, la classe class ne peut être nouvelle que par la machine virtuelle Java. Toute classe est un objet instance de la classe Class. Cet objet instance a trois expressions :


public class User{
} 
public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");
 
//可以通过类的类型创建该类的实例对象
User user=(User)c1.newInstance();
}

2. Chargement dynamique de la classe

Class. nom complet de la classe); Cette méthode représente non seulement le type de la classe, mais représente également la classe chargée dynamiquement. Les classes chargées au moment de la compilation sont chargées statiquement et les classes chargées au moment de l'exécution sont chargées dynamiquement.

3. Obtenir des informations sur la méthode

Les types de données de base, les mots-clés void sont des instances de la classe Class que vous pouvez utiliser get
ame ; ();getSimpleName() obtient le nom de la classe.


Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());

Récupérez toutes les méthodes du cours et imprimez-les :


public static void printClassInfo(Object object){
  Class c=object.getClass();
  System.out.println("类的名称:"+c.getName());
  /**
   * 一个成员方法就是一个method对象
   * getMethod()所有的 public方法,包括父类继承的 public
   * getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。
   */
  Method[] methods=c.getMethods();//获取方法
  //获取所以的方法,包括private ,c.getDeclaredMethods();
  for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>


public class ReflectTest {
  public static void main(String[] args){
    String s="ss";
    ClassUtil.printClassInfo(s);
  }
}

Exécuter :


类的名称:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…

4. Obtenez les informations sur les variables membres

Vous pouvez également obtenir les informations sur les variables membres de la classe


public static void printFiledInfo(Object o){
  Class c=o.getClass();
  /**
  * getFileds()获取public
  * getDeclaredFields()获取所有
  */
  Field[] fileds=c.getDeclaredFields();
  for(Field f:fileds){
   //获取成员变量的类型
   Class filedType=f.getType();
   System.out.println(filedType.getName()+" "+f.getName());
  }
 }


public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    ClassUtil.printFiledInfo(s);
  }

Exécuter :


[C value 
int hash 
long serialVersionUID 
[Ljava.io.ObjectStreamField; serialPersistentFields 
java.util.Comparator CASE_INSENSITIVE_ORDER 
int HASHING_SEED 
int hash32

5. Obtenir des informations sur le constructeur


public static void printConstructInfo(Object o){
  Class c=o.getClass();
  Constructor[] constructors=c.getDeclaredConstructors();
  for (Constructor con:constructors){
   System.out.print(con.getName()+"(");
   Class[] typeParas=con.getParameterTypes();
   for (Class class1:typeParas){
    System.out.print(class1.getName()+" ,");
   }
   System.out.println(")");
  }
 }


public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    //ClassUtil.printFiledInfo(s);
    ClassUtil.printConstructInfo(s);
  }

Exécuter :


java.lang.String([B ,) 
java.lang.String([B ,int ,int ,) 
java.lang.String([B ,java.nio.charset.Charset ,) 
java.lang.String([B ,java.lang.String ,) 
java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) 
java.lang.String(int ,int ,[C ,) 
java.lang.String([C ,boolean ,) 
java.lang.String(java.lang.StringBuilder ,) 
java.lang.String(java.lang.StringBuffer ,)
…

6. Opérations de réflexion de méthode

Obtenir une méthode : Besoin de obtenir la méthode Les paramètres de nom et de méthode déterminent une méthode. Opération de réflexion de la

méthode :


method.invoke(对象,参数列表);

Par exemple :


class A{
 public void add(int a,int b){
  System.out.print(a+b);
 }
 public void toUpper(String a){
  System.out.print(a.toUpperCase());
 }
}


public static void main(String[] args) {
  A a=new A();
  Class c=a.getClass();
  try {
   Method method=c.getMethod("add",new Class[]{int.class,int.class});
   //也可以 Method method=c.getMethod("add",int.class,int.class);
   //方法的反射操作
   method.invoke(a,10,10);
  }catch (Exception e){
   e.printStackTrace();
  }
 }

Exécuter :


20

Cet article a expliqué l'utilisation de base de la réflexion Java. Il peut déterminer le. classe à laquelle appartient tout objet au moment de l'exécution ; construire un objet de n'importe quelle classe au moment de l'exécution ; déterminer les variables membres et les méthodes de n'importe quelle classe au moment de l'exécution ; appeler la méthode de n'importe quel objet au moment de l'exécution ;

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