Maison  >  Article  >  Java  >  Résumé des connaissances sur le mécanisme de réflexion Java qui doivent être maîtrisées

Résumé des connaissances sur le mécanisme de réflexion Java qui doivent être maîtrisées

巴扎黑
巴扎黑original
2017-04-09 10:35:321781parcourir
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】


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

Utilisation de la classe

Méthode de réflexion

Réflexion du constructeur

Réflexion des variables membres

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 d'instance a trois méthodes d'expression :

public class User{
}

public class ClassTest{
User u=new User();
//Méthode 1 :
Classe c1=User.class;
//Méthode 2:
Classe c2=u.getClass();
//Méthode 3:
Classe c3=Class.forName(" com.forezp.User");

//Vous pouvez créer un objet instance de la classe via le type de la classe
User user=(User)c1.newInstance();
}

2. Chargement dynamique de la classe

Class.forName (nom complet de la classe) représente non seulement le type de la classe, mais représente également le chargement dynamique de la classe. 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. Obtention des informations sur la méthode

Les types de données de base et les mots-clés void sont des instances de la classe Class ; le nom de la classe peut être obtenu via getame(); () .

Classe c1=String.class;
Classe c2=int.class;
Classe c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());
Récupérez toutes les méthodes de la classe et imprimez-les :

public static void printClassInfo(Object object){
Class c= object .getClass();
System.out.println("Nom de classe : "+c.getName());

/**
* Une méthode membre est un objet méthode
* * getMethod() récupère toutes les méthodes publiques, y compris celles héritées de la classe parent
* getDeclaredMethods() récupère toutes les méthodes de la classe, y compris privées, mais pas de méthode héritée.
*/
Method[] méthodes= c.getMethods();//Obtenir les méthodes
//Obtenir toutes les méthodes, y compris privées, c.getDeclaredMethods();

for(int i=0;i                                                                                                                                                                 Classe returnType=methods[i].  ​.getReturnType();         System.out.print(returnType.getName()) :
System.out.print(methods[i].getName()+" (");

Class[] ParameterTypes=methods[i].getParameterTypes();
for(Class class1:parameterTypes){
                System.out.print(class1.getName()+ ","); }
classe publique ReflectTest {

public static void main(String[] args){
String s="ss";
ClassUtil.printClassInfo(s);
>
}
Exécuter :




4. Obtenez les informations sur la variable membre

Vous pouvez également obtenir les informations sur la variable membre de les fichiers class

public static void printFiledInfo(Object o){

类的名称:java.lang.String

booleanequals(java.lang.Object,)

java.lang.StringtoString()

inthashCode()

…
Class c=o.getClass();

/**

* getFileds() devient public

* getDeclaredFields() obtient tout
*/
Field[] =c.getDeclaredFields();

for(Field f:fileds){
" "+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

五、获取构造函数的信息

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);
       }
运行:

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 ,)

...

六、方法反射的操作

获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。

方法的反射操作:

method.invoke(对象,参数列表);
举个例子:

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();
       }
   }
运行:

20


本篇文章已经讲解了java反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

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