Maison  >  Article  >  Java  >  Introduction détaillée à la réflexion Java pour obtenir des informations sur les classes et les objets

Introduction détaillée à la réflexion Java pour obtenir des informations sur les classes et les objets

黄舟
黄舟original
2017-03-28 10:51:531575parcourir

La réflexion peut résoudre le problème selon lequel il est impossible de prédire au moment de la compilation à quel objet et classe appartiennent, et les informations de l'objet et de la classe ne peuvent être connues que sur la base des informations lorsque le programme est en cours d'exécution.

Lorsque deux personnes collaborent au développement, il vous suffit de connaître le nom de classe de l'autre partie pour effectuer le développement préliminaire.

Obtenir l'objet de classe

  • Méthode statique Class.forName(String clazzName)

  • Appeler l'attribut de classe de la classe , La classe Person. renvoie l'objet de classe Person (recommandé)

  • Appeler la méthode getClass() d'un objet

Utilisation spécifique Vous devez toujours choisir en fonction des conditions réelles. La première méthode est relativement gratuite. Il vous suffit de connaître le nom d'une classe. Elle ne vérifiera pas si la classe existe. >Obtenir des informations sur la classe

Obtenir le constructeur de classe

     : renvoie la classe correspondante de cet objet Class avec les paramètres formels spécifiés du constructeur public
  • Connstructor8742468051c85b06f0a0af9e3e506b5c getConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)

  •  : Renvoie tous les constructeurs publics de la classe correspondant à cet objet Class
  • Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getConstructors()

  •  : Renvoie cet objet de classe Le constructeur avec les paramètres spécifiés de la classe correspondante n'a rien à voir avec les droits d'accès du constructeur
  • Constructor8742468051c85b06f0a0af9e3e506b5c[] getDeclaredConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)

  • : Renvoie tous les constructeurs de la classe correspondante de cet objet classe, et les droits d'accès du constructeur Non pertinent
  • Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredConstructors()

    Obtenir la méthode membre de la classe

     : renvoie la méthode publique avec les paramètres formels spécifiés de la classe correspondante de cet objet de classe
  • Method getMethod(String name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)

  •  : Renvoie toutes les méthodes publiques de la classe représentée par cet objet de classe
  • Method[] getMethods()

  •  : Renvoie la classe spécifiée correspondant à cet objet de classe. La méthode du paramètre formel n'a rien à voir avec les droits d'accès à la méthode
  • Method getDeclaredMethod(string name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)

  • : Renvoie toutes les méthodes de la classe correspondante de cet objet classe, n'a rien à voir avec la méthode droits d'accès
  • Method[] getDeclaredMethods()

    Obtenir les variables membres de la classe

     : Renvoie la variable membre publique du nom spécifié correspondant à cet objet de classe
  • Field getField(String name)

  •  : Renvoie toutes les variables membres publiques de la classe correspondant à cet objet de classe.
  • Field[] getFields()

  •  : Renvoie la variable membre avec l'objet spécifié nom de la classe correspondant à cet objet de classe, quelles que soient les autorisations d'accès aux variables membres
  • Field getDeclaredField(String name)

  •  : Renvoie toutes les variables membres de la classe correspondant à cet objet de classe, quels que soient les droits d'accès des variables membres
  • Field[] getDeclaredFields()

    Obtenir les annotations de classe

     : Essayez d'obtenir le type d'annotation spécifié de la classe correspondante de la classe objet. Si l'annotation de type n'existe pas, retournez null
  • ff56b21ab54c6b5c37cb9b57f821804eA getAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)

  •  : C'est une nouveauté dans Java 8. Cette méthode obtient l'annotation du type spécifié qui modifie directement la classe correspondante. de l'objet de classe. S'il n'existe pas, il renvoie null
  • ff56b21ab54c6b5c37cb9b57f821804eA getDeclaredAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)

  •  : renvoie toutes les annotations
  • Annotation[] getAnnotations()

  • qui modifient. la classe correspondante de cet objet de classe : renvoie toutes les annotations qui modifient la classe correspondante de cet objet de classe
  • Annotation[] getDeclaredAnnotations()

  •  : la fonction de cette méthode est fondamentalement similaire à la méthode getAnnotation() introduit plus tôt, mais comme Java8 a ajouté la fonction d'annotation répétée, vous devez utiliser cette méthode pour obtenir plusieurs annotations du type spécifié qui modifient la classe
  • ff56b21ab54c6b5c37cb9b57f821804eA[] getAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)

  •  : La fonction de cette méthode est similaire à la méthode getDeclaredAnnotations() introduite précédemment. C'est également à cause de la fonction d'annotation répétée de Java8. Vous devez utiliser cette méthode pour obtenir le type spécifié qui modifie directement la classe.
  • Récupérer la classe interne de cette classeff56b21ab54c6b5c37cb9b57f821804eA[] getDeclaredAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)

 : Renvoie toutes les classes internes contenues dans la classe correspondante de cette formation de classe

  • Récupérer la classe externe où se trouve l'objet de cette classe Class6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredClasses()

: Renvoie la classe externe où se trouve la classe correspondante de l'objet Class

  • Récupérer l'interface implémentée par la classe correspondante de cet objet classeClass6b3d0130bba23ae47fe2b8e8cddf0195 getDeclaringClass()

 : Renvoie toutes les interfaces implémentées par la classe correspondante de cet objet Classe

Récupérer la classe parent héritée par la classe correspondante de cet objet de classe

  • Class117c5a0bdb71ea9a9d0c2b99b03abe3e getSuperclass() : Renvoie l'objet Class de la super classe de la classe correspondante de cet objet Classe

Obtenir le modificateur, le package, le nom de la classe et d'autres informations de base correspondant à l'objet classe

  • int getModifiers() : Retour la classe ou l'interface Tous les modificateurs sont composés de constantes publiques, protégées, privées, finales, statiques, abstraites et autres constantes correspondantes. Le entier renvoyé doit être décodé à l'aide de la méthode de la classe d'outils Modifier pour obtenir le vrai modificateur. .

  • Package getPackage() : Obtenez le package de cette classe

  • String getName() : Renvoyez cette CLAss sous forme de String. L'abréviation de la classe représentée par l'objet

Déterminer si la classe est un type d'interface, d'énumération ou d'annotation

  • boolean isAnnotation() : Renvoie cette classe Si l'objet représente un type d'annotation

  • boolean isAnnotationPresent(Classe7efc8cbc31a41b0598dead74d6893ddannotationClass) : Détermine si cet objet Classe est décoré avec la classe Annotation

  • boolean isAnonymousClass() : Renvoie cette classe Si l'objet est une classe anonyme

  • boolean isArray() : Renvoie si cet objet de classe représente un tableauclass

  • boolean isEnum() : Renvoie si cet objet de classe représente une énumération

  • boolean isInterface() : Renvoie si cet objet de classe représente une interface

  • boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object<code>boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object</a> obj) obj ) : Déterminer obj Qu'il s'agisse d'une instance de cet objet de classe, cette méthode peut remplacer complètement l'instanceofoperator

public interface Colorable {
     public void value();
}
public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class<Colorable> cls=Colorable.class;
        System.out.println(cls.getMethod("value"));
        System.out.println(cls.isAnnotation());
        System.out.println(cls.isInterface());
    }

}

结果

public abstract void com.em.Colorable.value()
false
true

Nouvelle réflexion des paramètres de méthode en Java 8

  • int getParameterCount() : Obtenez le nombre de paramètres formels du constructeur ou de la méthode

  • Parameter[] getParameters() : Récupère tous les paramètres formels du constructeur ou de la méthode

  • getModifiers() : Récupère les modificateurs qui modifient les paramètres formels

  • String getName() : Obtenez le nom du paramètre formel

  • Type getParameterizedType() : Obtenez le type de paramètre formel avec des génériques

  • Class6b3d0130bba23ae47fe2b8e8cddf0195getType() : Obtenez le paramètre formel Type

  • boolean isNamePresent() : Cette méthode renvoie si le fichier de classe de la classe contient les informations de nom de paramètre formel de la méthode

  • boolean isVarArgs() : Cette méthode permet de déterminer si le paramètre est un nombre variable de paramètres formels

public class Test {
    public void getInfo(String str,List<String>list){
        System.out.println("成功");
    }
}
public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class<Test> cls=Test.class;
        Method med=cls.getMethod("getInfo", String.class,List.class);
        System.out.println(med.getParameterCount());
        Parameter[] params=med.getParameters();
        System.out.println(params.length);
        for(Parameter par:params){
            System.out.println(par.getName());
            System.out.println(par.getType());
            System.out.println(par.getParameterizedType());
        }
    }

}

结果

2
2
arg0
class java.lang.String
class java.lang.String
arg1
interface java.util.List
java.util.List<java.lang.String>

objet généré par réflexion

  • Utilisez la méthode newInstance() de l'objet Class pour créer une instance de l'objet Class. Cette méthode nécessite un constructeur par défaut (plus. couramment utilisé)

  • Utilisez d'abord l'objet Class pour obtenir l'objet Constructor spécifié, puis appelez la méthode newInstance() de l'objet Constructor pour créer une instance de la classe correspondante de la classe object

Méthode d'appel de réflexion

  • Object invoke(Object obj,Object...args) : L'obj dans cette méthode est l'appel principal pour exécuter la méthode, et les arguments suivants sont les paramètres réels transmis à la méthode lors de l'exécution de la méthode

public class Test {

    public Test(String str) {
        System.out.println(str);
    }
    public void getInfo(String str){
        System.out.println(str);
    }
}
public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getMethod("getInfo", String.class);
        med.invoke(test, "调用方法成功");
    }

}

结果

初始化
调用方法成功

Ensuite, l'agent examinera de plus près regardez les châtaignes ci-dessous

public class Test {

    public Test(String str) {
        System.out.println(str);
    }
    //私有方法
    private void getInfo(String str){
        System.out.println(str);
    }
}
public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
      //为啥使用这个方法呢?
        Method med=cls.getDeclaredMethod("getInfo", String.class);
      //为啥使用这个方法呢?
        med.setAccessible(true);
        med.invoke(test, "调用方法成功");
    }

}

结果

初始化
调用方法成功

setAccessible(boolean flag): Définissez la valeur sur true, indiquant que l'accès au langage Java la vérification des autorisations doit être annulée lors de l'utilisation de cette méthode

Valeur de la variable membre d'accès

  • getXxx(Object obj) : obtenez la valeur de cette variable membre de l'objet obj. Xxx correspond ici à 8 types de base. Si le type de la variable membre est de type référence , supprimez la partie Xxx

  • setXxx(Object obj,Xxx val) : changez l'objet obj. La variable membre est définie sur la valeur val. Le Xxx correspond ici aux 8 types de base. Si le type de la variable membre est un type référence, annulez le Xxx après set

Les deux méthodes ci-dessus peuvent accéder à tout. Variables de membres, y compris les variables de membres privés

public class Test {
    private int num;

    public Test(String str) {
        System.out.println(str);
    }
    private void getInfo(String str){
        System.out.println(str);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }

}
public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getDeclaredMethod("getInfo", String.class);
        med.setAccessible(true);
        med.invoke(test, "调用方法成功");
        Field fld=cls.getDeclaredField("num");
        fld.setAccessible(true);
        fld.setInt(test, 12);
        System.out.println(fld.getInt(test));
    }

}

结果

初始化
调用方法成功
12

Tableau d'opérations

sous java.lang. Reflect package Il existe une classe Array qui peut créer dynamiquement un tableau

static Object newInstance(Class6b3d0130bba23ae47fe2b8e8cddf0195componentType,int...length) : Créer un nouveau tableau avec un type d'élément spécifié et des dimensions spécifiées

static xxx getXxx(Object array,int index):返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()

static void setXxx(Object array,int index,xxx val):将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()

public class ArrayInfo {

    public static void main(String[] args) {
        Object arrays=Array.newInstance(String.class, 3);
        Array.set(arrays, 0, "第一个");
        Array.set(arrays, 1, "第二个");
        Array.set(arrays, 2, "第三个");
        System.out.println(Array.get(arrays, 2));
    }
}

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