Table des matières
Obtenir l'objet de classe
 : Renvoie toutes les classes internes contenues dans la classe correspondante de cette formation de classe
: Renvoie la classe externe où se trouve la classe correspondante de l'objet Class
 : 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
Obtenir le modificateur, le package, le nom de la classe et d'autres informations de base correspondant à l'objet classe
Déterminer si la classe est un type d'interface, d'énumération ou d'annotation
Nouvelle réflexion des paramètres de méthode en Java 8
objet généré par réflexion
Méthode d'appel de réflexion
Valeur de la variable membre d'accès
Tableau d'opérations
Maison Java javaDidacticiel 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

Mar 28, 2017 am 10:51 AM

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
  • Connstructor<T> getConstructor(Class<?>...parameterTypes)

  •  : Renvoie tous les constructeurs publics de la classe correspondant à cet objet Class
  • Constructor<?>[] 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
  • Constructor<T>[] getDeclaredConstructor(Class<?>...parameterTypes)

  • : Renvoie tous les constructeurs de la classe correspondante de cet objet classe, et les droits d'accès du constructeur Non pertinent
  • Constructor<?>[] 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,Class<?>...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,Class<?>...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
  • <A extends Annotation>A getAnnotation(Class<A>annotationClass)

  •  : 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
  • <A extends Annotation>A getDeclaredAnnotation(Class<A>annotationClass)

  •  : 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
  • <A extends Annotation>A[] getAnnotationByType(Class<A>annotationClass)

  •  : 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 classe<A extends Annotation>A[] getDeclaredAnnotationByType(Class<A>annotationClass)

 : 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 Class<?>[] 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 classeClass<?> 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

  • Class<? super T> 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(Class<? extends Annotation>annotationClass) : 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();
}
Copier après la connexion
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());
    }

}
Copier après la connexion

结果

public abstract void com.em.Colorable.value()
false
true
Copier après la connexion

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

  • Class<?>getType() : 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("成功");
    }
}
Copier après la connexion
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());
        }
    }

}
Copier après la connexion

结果

2
2
arg0
class java.lang.String
class java.lang.String
arg1
interface java.util.List
java.util.List<java.lang.String>
Copier après la connexion

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);
    }
}
Copier après la connexion
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, "调用方法成功");
    }

}
Copier après la connexion

结果

初始化
调用方法成功
Copier après la connexion
Copier après la connexion

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);
    }
}
Copier après la connexion
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, "调用方法成功");
    }

}
Copier après la connexion

结果

初始化
调用方法成功
Copier après la connexion
Copier après la connexion

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;
    }

}
Copier après la connexion
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));
    }

}
Copier après la connexion

结果

初始化
调用方法成功
12
Copier après la connexion

Tableau d'opérations

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

static Object newInstance(Class<?>componentType,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));
    }
}
Copier après la connexion

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1664
14
Tutoriel PHP
1268
29
Tutoriel C#
1242
24
Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

PHP: un langage clé pour le développement Web PHP: un langage clé pour le développement Web Apr 13, 2025 am 12:08 AM

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7

PHP vs Python: comprendre les différences PHP vs Python: comprendre les différences Apr 11, 2025 am 12:15 AM

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

PHP vs autres langues: une comparaison PHP vs autres langues: une comparaison Apr 13, 2025 am 12:19 AM

PHP convient au développement Web, en particulier dans le développement rapide et le traitement du contenu dynamique, mais n'est pas bon dans les applications de la science des données et de l'entreprise. Par rapport à Python, PHP présente plus d'avantages dans le développement Web, mais n'est pas aussi bon que Python dans le domaine de la science des données; Par rapport à Java, PHP fonctionne moins bien dans les applications au niveau de l'entreprise, mais est plus flexible dans le développement Web; Par rapport à JavaScript, PHP est plus concis dans le développement back-end, mais n'est pas aussi bon que JavaScript dans le développement frontal.

PHP vs Python: fonctionnalités et fonctionnalités de base PHP vs Python: fonctionnalités et fonctionnalités de base Apr 13, 2025 am 12:16 AM

PHP et Python ont chacun leurs propres avantages et conviennent à différents scénarios. 1.PHP convient au développement Web et fournit des serveurs Web intégrés et des bibliothèques de fonctions riches. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et une bibliothèque standard puissante. Lors du choix, il doit être décidé en fonction des exigences du projet.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Impact de PHP: développement Web et au-delà Impact de PHP: développement Web et au-delà Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP: la fondation de nombreux sites Web PHP: la fondation de nombreux sites Web Apr 13, 2025 am 12:07 AM

Les raisons pour lesquelles PHP est la pile technologique préférée pour de nombreux sites Web incluent sa facilité d'utilisation, son soutien communautaire solide et son utilisation généralisée. 1) Facile à apprendre et à utiliser, adapté aux débutants. 2) Avoir une énorme communauté de développeurs et des ressources riches. 3) Largement utilisé dans WordPress, Drupal et d'autres plateformes. 4) Intégrez étroitement aux serveurs Web pour simplifier le déploiement du développement.

See all articles