Le mécanisme de réflexion Java nous permet de compiler le temps pendant )Sauf le runtime (Runtime) pour vérifier les informations sur la classe, l'interface, la variable et la méthode.
Les fonctions de réflexion sont les suivantes :
Pour n'importe quelle classe, vous pouvez connaître toutes les propriétés et méthodes de cette classe
Récupérer l'objet de la classe
//1.在编译期获取类对象Class cls = Demo.class //2.在运行期获取类对象(注意:需要包括完整的包名) Cllss clas = Class.forName("com.test.Demo")
Récupérer le nom de la classe
Class cls = ...// 1.获取完整类型(包括包名)String className = cls.getName(); // 2.获取简单类名 String simpleClassName =cls.getSimpleName();
Obtenir le modificateur de la classe
Class cls = ...// 修饰符都被包装成一个 int 类型的数字,这样每个修饰符都是一个位标识(flag bit) int modifiers = cls.getModifiers();// 判断修饰符类型Modifier.isPublic( modifiers); Modifier.isProtected( modifiers); Modifier.isPrivate( modifiers); Modifier.isAbstract( modifiers); Modifier.isInterface( modifiers); Modifier.isFinal( modifiers); Modifier.isStatic( modifiers); Modifier.isNative( modifiers); Modifier.isStrict( modifiers); Modifier.isSynchronized( modifiers); Modifier.isTransient( modifiers); Modifier.isVolatile( modifiers);
Obtenez les informations sur le forfait de la classe
Class cls =... Package p = cls.getPackage();
Obtenez le classe parent dont la classe hérite
Class cls = ... Class superClass = cls.getSuperclass();
Obtenir le type d'interface implémenté par la classe
Class cls = ...// 类可以实现多个接口,因此返回的是接口数组Class [ ] interfaces = cls.getInterfaces();
PublicConstructeur
Class cls = ...// 1.获取所有构造函数Constructor[] constructors = cls.getConstructors(); // 2.获取指定构造函数,不存在匹配则抛出异常。 // 对应的构造函数入参类为 Person(String str, int i)Constructor constructor = cls.getConstructor(new Class[]{String.class,int.class});
Obtenir le paramètre d'entrée du constructeur tapez
Constructor constructor = ... // 因为构造函数的入参有多个,因此返回的数组Class [] paramterTypes = constructor.getParameterTypes(); for(Class paramterType: paramterTypes ){ // do something...}
Classe d'instanciation du constructeur
Class cls = ... Constructor constructor = cls.getConstructor(new Class[]{String.class}); // Object[] 数组表示入参的具体值,需要与 Class[] 的入参类型完全匹配Demo demo = (Demo) constructor.newInstance(new Object[]{"hello"});
Obtenir toutes les variables (publiques, non publiques)
Class cls = ...// 1.获取所有公共变量Field[] fields = cls.getFields(); // 2.获取所有非公共变量Field [] privateFields =cls.getDeclaredFields();
Obtenir la variable spécifiée (publique, non publique)
Class cls = ...//入参为变量名称,名称不匹配则抛出异常// 获取指定公共变量Field field = cls.getField("num"); // 获取指定非公共变量Field privateField = cls.getDeclaredField("str");
Manipuler la variable
Class<?> cls = Demo.class; Demo demo = (Demo) cls.newInstance();// 1.1.公共方法的 setter、getterField field = cls.getField("num"); field.set(demo, 1000);int filedValue = (Integer) field.get(demo);// 2.1 非公共方法的 setter、getterField privateField = cls.getDeclaredField("str"); privateField.setAccessible(true); // 关键 -> 操作之前,需要设置访问权限privateField.set(demo, "hello"); String privateFieldValue = (String) privateField.get(demo);
Obtenir toutes les méthodes
Class cls = ...// 1.获取所有公共方法(包括从父类继承而来的)Method[] methods = cls.getMethods(); // 2.获取所有非公共方法(包括从父类继承而来的)Method [] privateMethods = cls.getDeclaredMethods();
Obtenir la méthode spécifiée
Class cls = ...// 1.获取指定公共方法,入参为:方法名、方法入参Method method = cls.getMethod("print", new Class[]{String.class}); // 2.获取指定非公共方法,入参为:方法名、方法入参Method privateMethod = cls.getDeclaredMethod("say", new Class[]{int.class});
Récupérer le type de paramètre de la méthode
Method method = ...// 1.获取方法的所有入参类型Class [] paramterTypes = method.getParameterTypes(); // 2.获取方法的返回值类型Class reeturnType = method.getReturnType();
Exécuter la méthode
Class cls = Demo.class; Demo demo = (Demo) cls.newInstance(); Method method = cls.getMethod("print", new Class[]{String.class});//1.执行公用方法,入参为:类实例,方法入参的具体值method.invoke(demo, "hello"); //2.执行非公共方法Method privateMethod = cls.getDeclaredMethod("print", new Class[]{String.class}); privateMethod.setAccessible(true); // 关键 -> 操作之前,需要获得访问权限privateMethod.invoke(demo, "hello");
Méthode getter/setter du juge
public static boolean isGetter(Method method){ if(!method.getName().startsWith("get")){ return false; } if(method.getParameterTypes().length !=0){ return false; } if(void.class.equals(method.getReturnType())){ return false; } return true; } public static boolean isSetter(Method method){ if(!method.getName().startsWith("set")){ return false; } if(method.getParameterTypes().length !=1){ return false; } return true; }
Obtenir un objet de tableau
int [ ] intArray = ... Class arrayCls = intArray.class;
Obtenir le type de membre du tableau
Class arrayCls = ... Class arrayComponentType =arrayCls .getComponentType();
Créer un tableau
// 创建一个数组,类型为 int ,容量为 3int [ ] intArray = (int[]) Array.newInstance(int.class, 3); //在 JVM 中字母I代表int类型,左边的‘[’代表我想要的是一个int类型的数组Class intArrayClass = Class.forName("[I"); //注意‘[L’的右边是类名,类名的右边是一个‘;’符号。这个的含义是一个指定类型的数组。 stringArrayClass = Class.forName("[Ljava.lang.String;");
Ajouter des éléments de tableau
int [ ] intArray = ...// 添加元素,数组为 intArray,位置为 0 ,值为 100Array.set(intArray, 0, 100); Array.set(intArray, 1, 200); System.out.println("intArray[0] = " + Array.get(intArray, 0)); System.out.println("intArray[1] = " + Array.get(intArray, 1));Ce qui précède est le contenu de 08.Java Basics - Reflection Pour plus de contenu connexe, veuillez faire attention au PHP. Site chinois (www.php .cn) !