


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
Obtenir le constructeur de classeUtilisation 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
- : renvoie la classe correspondante de cet objet Class avec les paramètres formels spécifiés du constructeur public
Connstructor<t> getConstructor(Class>...parameterTypes)</t>
: 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)</t>
: Renvoie tous les constructeurs de la classe correspondante de cet objet classe, et les droits d'accès du constructeur Non pertinent-
Obtenir la méthode membre de la classeConstructor>[] getDeclaredConstructors()
- : 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 -
Obtenir les variables membres de la classeMethod[] getDeclaredMethods()
- : 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 membresField 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-
Obtenir les annotations de classeField[] getDeclaredFields()
- : 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><a>annotationClass)</a>
: 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><a>annotationClass)</a>
: 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 classeAnnotation[] 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><a>annotationClass)</a>
: 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><a>annotationClass)</a>
: 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 classe
Class> 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 classeString 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'annotationboolean isAnnotationPresent(Class extends Annotation>annotationClass)
: Détermine si cet objet Classe est décoré avec la classe Annotationboolean isAnonymousClass()
: Renvoie cette classe Si l'objet est une classe anonymeboolean isArray()
: Renvoie si cet objet de classe représente un tableauclassboolean isEnum()
: Renvoie si cet objet de classe représente une énumérationboolean isInterface()
: Renvoie si cet objet de classe représente une interfaceboolean 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éthodeParameter[] getParameters()
: Récupère tous les paramètres formels du constructeur ou de la méthodegetModifiers()
: Récupère les modificateurs qui modifient les paramètres formelsString getName()
: Obtenez le nom du paramètre formelType getParameterizedType()
: Obtenez le type de paramètre formel avec des génériquesClass>getType()
: Obtenez le paramètre formel Typeboolean 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éthodeboolean 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 XxxsetXxx(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(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)); } }
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Dreamweaver Mac
Outils de développement Web visuel

PhpStorm version Mac
Le dernier (2018.2.1) outil de développement intégré PHP professionnel

MantisBT
Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

Adaptateur de serveur SAP NetWeaver pour Eclipse
Intégrez Eclipse au serveur d'applications SAP NetWeaver.

Version Mac de WebStorm
Outils de développement JavaScript utiles