一、反射机制概述
- Java中的一个类由若干个对象组成,Field属性对象,Method方法对象,Constructor构造器对象,Modifier修饰符对象,数据类型对象,Void对象。
- 反射是类的自省,通过反射可以动态获取类中的方法、属性、构造方法等。
- 我们以往编写的代码都是编译期代码,这些代码是提前写好,固定的代码,反射在运行期执行的代码,使用反射编写的代码中是没有具体定义那个对象的,它会根据需要在运行期自动的创建类的对象并调用相关方法。
- 我们可以通过反射来开发通用功能的方法或类;目前所使用所有企业级开发框架都离不开反射。
二、反射的基本使用
-
要使用反射必须先拿到一个类或对象的Class对象。获得一个类的class对象(字节码对象)的方式:
(1) 通过类名获得该类的字节码对象
(2)通过一个类的完整路径获得该类的字节码对象
(3)通过对象获取该对象的字节码对象
-
使用反射操作类中的属性
(1)获得类中的属性//获得一个类的字节码对象 Class userCla = User.class; //获得类中的所有属性 Field[] fields = userCla.getDeclaredFields(); //使用循环遍历Field数组,并获取每个属性的详情 for(Field field : fields){ //获得属性名 String fieldName = field.getName(); //获得属性的类型 Class typeClass = field.getType(); //获得属性的修饰符 int modifier = field.getModifiers(); //将修饰符的数字转换为对应的字符串 String modifierName = Modifier.toString(modifier); }
(2)操作相应的属性
Class userCla = User.class; //根据属性名获得属性对象 Field field = userCla.getDeclaredField("password"); //调用该属性 //创建类的对象,调用无参数的构造方法创建对象 Object obj = userCla.newInstance(); //调用属性设置值,指定调用哪个对象的field方法并赋值 field.set(obj,"000000"); //获取属性的值 Object value = field.get(obj);
-
使用反射操作类中的方法
(1)获得类中的所有方法细节Class userCla = User.class; //获取类中的所有方法 Method[ ] methods = userCla.getDeclaredMethods(); //遍历methods数组 for(Method method : methods){ //获得方法名 String methodName = method.getName(); //获得方法的返回类型 Class returnType = method.getReturnType(); //获得方法的修饰符 String modifierName =Modifier.toString(method.getModifiers()); //获得参数列表 Class [ ] params = method.getParameterTypes(); System.out.println(modifierName+" "+returnType+" "+methodName); System.out.println("参数列表:"); for(Class param : params){ System.out.prirntln(param); } }
(2)根据方法名和方法的参数列表获得一个方法对象,并调用该方法。
Class userCla = User.class; //根据方法名和参数获得一个对象 Method method = userCla.getDeclaredMethod("setUsername",String.class); //创建对象 Object obj = userCla.newInstance(); //调用方法,设置username属性的值 method.invoke(obj,"小胖"); //获得username对象的get方法来获取username的值 Method getMethod = userCla.getDeclaredMethod("getUsername"); //调用方法,并返回结果 Object objValue = getMethod.invoke(obj); System.out.println(objValue);
-
使用反射操作类中的方法
(1)获得所有构造方法Class userCla = User.class; //获取类中的所有构造方法 Constructor [ ] constructors = userCla.getDeclaredConstructors(); //遍历数组,获得每个构造器详情 for(Constructor constructor : constructors){ //获得名字 String constructorName = constructor.getName(); //获得操作符的修饰符 String modifierName = Modifier.toString(constructor.getModifiers()); //获得参数列表 Class[ ] params = constructor.getParameterTypes(); System.out.prirntln(modifierName+" "+constructorName); System.out.println("参数 列表:"); for(Class param : params){ System.out.println(param); } }
(2)根据参数列表获得指定的构造器并利用该构造器创建对象
Class userCla = User.class; //使用无参构造创建类的对象 Object obj =userCla.newInstance(); //获得带有参数的构造器 Constructor constructor = userCla.getDeclaredConstructor(int.class,String.class,String.class); //利用获得的构造方法对象来创建类的对象 Object obj1 = constructor.newInstance(10,"admin","123456"); System.out.println(obj1);