Maison >Java >javaDidacticiel >Introduction détaillée à la réflexion Java pour obtenir des informations sur les classes et les objets
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.
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
Connstructor8742468051c85b06f0a0af9e3e506b5c getConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getConstructors()
Constructor8742468051c85b06f0a0af9e3e506b5c[] getDeclaredConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredConstructors()
Method getMethod(String name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Method[] getMethods()
Method getDeclaredMethod(string name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes)
Method[] getDeclaredMethods()
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
ff56b21ab54c6b5c37cb9b57f821804eA getAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
ff56b21ab54c6b5c37cb9b57f821804eA getDeclaredAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
Annotation[] getAnnotations()
Annotation[] getDeclaredAnnotations()
ff56b21ab54c6b5c37cb9b57f821804eA[] getAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
Récupérer la classe interne de cette classeff56b21ab54c6b5c37cb9b57f821804eA[] getDeclaredAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)
Récupérer la classe externe où se trouve l'objet de cette classe Class6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredClasses()
Récupérer l'interface implémentée par la classe correspondante de cet objet classeClass6b3d0130bba23ae47fe2b8e8cddf0195 getDeclaringClass()
Class117c5a0bdb71ea9a9d0c2b99b03abe3e getSuperclass()
: Renvoie l'objet Class de la super classe de la classe correspondante de cet 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
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
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>
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
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
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
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!