Cet article vous apporte une brève introduction à la réflexion Java (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
1. Une brève introduction à Class
La classe Class représente les classes et les interfaces de l'application Java en cours d'exécution. Une énumération est une classe, une annotation est une interface et chaque tableau appartient également à une classe qui se reflète comme un objet de classe partagé par tous les tableaux ayant le même type d'élément et la même dimensionnalité. Les types Java primitifs (boolean, byte, char, short, int, long, float et double) et le mot-clé void sont également représentés sous forme d'objets de classe.
Extrait de la version chinoise de jdk1.8 Vous ne le comprendrez peut-être pas au début. Je vais maintenant l'expliquer phrase par phrase.
La première phrase : Après le chargement d'une classe, la JVM créera un objet Class de la classe correspondante dans la mémoire.
La deuxième phrase : les objets du même type et les tableaux de même dimension (quelle que soit la longueur) partagent le même objet Class en mémoire.
La troisième phrase : Les types primitifs ci-dessus auront également un objet Class dans la mémoire
package com.dingyu; import org.junit.Test; /** * Class的简单使用方法 * * @author 70241 * */ public class ClassDemo { @Test public void classTest1() { try { Class class1 = Class.forName("com.dingyu.User");// 第一种获取Class对象的方法 User user = new User(); Class class2 = user.getClass();// 第二种获取Class对象的方法 Class class3=User.class;//第三种获取Class对象的方法 System.out.println("接下来判断到底同一类的不同对象的Class对象是不是同一个:" + (class1.hashCode() == class2.hashCode()&&class1.hashCode() == class3.hashCode())); } catch (ClassNotFoundException e) { e.printStackTrace(); } } @Test public void classTest2() { String[] s1 = new String[10]; String[] s2 = new String[30]; String[][] s3 = new String[3][30]; System.out.println(s1.getClass().hashCode()==s2.getClass().hashCode()); System.out.println(s1.getClass().hashCode()==s3.getClass().hashCode()); } }
package com.dingyu; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /** * Class的简单用法 * * @author dingyu * */ public class ClassDemo02 { @Test public void usingClass() throws Exception { Class userClass = Class.forName("com.dingyu.User"); // 获得类名 System.out.println(userClass.getName());// 获得全类名 System.out.println(userClass.getSimpleName());// 获得类名 // 获得属性 Field[] fields = userClass.getDeclaredFields();// 获得所有的属性 for (Field field : fields) { System.out.println(field.getName()); } System.out.println(userClass.getDeclaredField("id").getName());// 获得指定的属性 // 获得方法 Method[] methods = userClass.getDeclaredMethods();// 获得所有的方法 for (Method method : methods) { System.out.println(method.getName()); } Method method = userClass.getDeclaredMethod("setId", int.class);// 获得指定的方法,前面方法名,后面方法的参数 System.out.println(method.getName()); // 获得构造器 Constructor[] constructors = userClass.getDeclaredConstructors(); System.out.println(constructors.length); Constructor constructor = userClass.getDeclaredConstructor(int.class, String.class, int.class);// 获得指定的构造器,需要指定构造的参数 System.out.println(constructor.getName()); // 获得注解 Annotation[] annotations = userClass.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } // 指定注解名 MyAnnotation annotation = (MyAnnotation)userClass.getDeclaredAnnotation(MyAnnotation.class); System.out.println(annotation); } }
package com.dingyu; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /** * 使用反射动态的调用构造器,方法,修改属性 * @author 70241 * */ public class ClassDemo03 { @Test @SuppressWarnings("all") public void usingClass() throws Exception { Class class1 = Class.forName("com.dingyu.User"); //使用反射去调用构造器 User user1 = (User) class1.newInstance();//调用的是无参的 Constructor constructor = class1.getDeclaredConstructor(int.class,String.class,int.class);//获得有参的构造器 User user2 = (User) constructor.newInstance(04,"dingyu",20);//动态生成对象 //使用反射去调用方法 Method methodSetId = class1.getDeclaredMethod("setId",int.class); methodSetId.invoke(user1, 02);//执行user1中的setId,后面是给的参数 System.out.println(user1.getId()); //使用反射去修改属性的值 Field field = class1.getDeclaredField("age"); field.setAccessible(true);//因为age是私有的,加上这句就表示这个属性不需要做安全检查 field.set(user1, 20); System.out.println(field.get(user1)); System.out.println(user1.getAge()); } }
package com.dingyu; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Map; /** * 反射获得带泛型的参数或返回值里泛型的的类型 * @author dingyu * */ public class ClassDemo04 { public void test01(Map<Integer, String> map, String s) { } public Map<Integer, String> test02() { return null; } public static void main(String[] args) throws Exception { //参数中带泛型的 Method method = ClassDemo04.class.getDeclaredMethod("test01", Map.class, String.class); Type[] types = method.getGenericParameterTypes();// 返回一个 Type对象的数组, Type以声明顺序表示由该对象表示的可执行文件的形式参数类型 // 打印这些参数的类型 for (Type type : types) { System.out.println(type.getTypeName()); if (type instanceof ParameterizedType) {// 如果是泛型的参数 Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 获得泛型的的类型 for (Type type2 : actualTypeArguments) { System.out.println(type2.getTypeName()); } } } //返回值中带泛型的 Method method02 = ClassDemo04.class.getDeclaredMethod("test02"); Type type = method02.getGenericReturnType();// 返回的类型 // 打印这些返回的类型 System.out.println(type.getTypeName()); if (type instanceof ParameterizedType) {// 如果是泛型的参数 Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 获得泛型的的类型 for (Type type2 : actualTypeArguments) { System.out.println(type2.getTypeName()); } } } }
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!