刚学的反射,利用博客写一篇笔记!(附上代码!)
1、下面是我的分析笔记
其他: 1、用static修饰的归位类所拥有的,没有static修饰的归对象拥有! 2、 反射机制: 不需要用到new,反射不需要new! 反射是程序运行的时候动态地加载类的属性和方法 获取类对象类型中的内容,都必须通过classType对象 步骤: 1、获取类的对象类型 语法格式: Class cls=Class.forName("包名.类名"); 举例: Class<?> classType=Class.forName("cn.jason.reflections.Constomer"); 说明: 此处的?代表任意类型对象,相当于Object 2、通过反射,获取类对象里面的所有属性 语法格式: Field[] fields=classType.getDeclaredFields(); //循环打印获取到的属性Name for (Field field : fields) { System.out.println(field.getName()); } 3、通过反射,获取类对象里面的所有方法或指定的方法 1)、获取所有的方法 //获取类中的所有的方法 Method[] methods=classType.getMethods(); for (Method method : methods) { System.err.println(method.getName()); } 2)、获取指定方法名称的方法 //属性的第一个字母截取出来,并且大写化 String firstLetter=name.substring(0, 1).toUpperCase(); //拼接属性get方法的方法名 String getMethodName="get"+firstLetter+name.substring(1); String setMethodName="set"+firstLetter+name.substring(1); //现在动态获取get方法 Method getmethod=classType.getDeclaredMethod(getMethodName, new Class[]{}); //现在动态获取set方法 参数列表:(int id) Method setmethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()}); 分析说明一下: (1)getDeclaredMethod(getMethodName, new Class[]{}); 该方法的第一个参数,是需要获取方法对象的方法名, 该方法的第二个参数,是执行方法的参数类别的, 的参数类型的数组 (2)getDeclaredMethod(setMethodName, new Class[]{field.getType()}); 其中的field.getType()是获取类字段的类型 (3反射程序中,关于参数类型的对象数组:用Class[]{}存放 具体的数据类型:用int.class、String.class等形式 提示:Integer.TYPE 效果等价于 int.class 4、通过反射,获取类对象(要执行反射的获取的方法,前提就是要获取类的对象,但不是new出来的,是反射获取得到的!) //通过反射来创建对象:等同于Constomer c=new Constomer(001,"Jason"):构造器-----这里的目的是获取类的对象(反射的形式获取) Object obj=classType.getConstructor(new Class[]{int.class,String.class}) .newInstance(new Object[]{18,"天使彦"}); 分析一下: 1)、这个方法是使用反射机制获取类的对象的,类似new出来的实例! 2)、其中:getConstructor(new Class[]{int.class,String.class}) 说明:参数列表放的是:构造方法的参数列表的数据类型、或数据类型的集合 5、执行方法---是否有返回值 根据方法的返回类型来确定 语法格式: 方法对象.invoke(类对象,实参数据集合) 举例: setmethod.invoke(obj,(new Object[]{18,"天使彦"}); Object value=getmethod.invoke(obj,(new Object[]{}); 说明一下: 实参数据集合:放在Object[]中,毕竟是参数据是可以为各种类型的!
2、下面是测试源码
实体类:
1 package cn.jason.reflections; 2 3 /** 4 * 反射测试: 5 * 用户类 6 * Created by Jason 2016-7-16 上午11:22:03 7 */ 8 public class Constomer { 9 10 /** 11 * 成员变量 12 */ 13 private int id; //用户id 14 private String name; //用户姓名 15 16 /** 17 *构造器: 18 */ 19 public Constomer(){ 20 21 } 22 public Constomer(int id,String name){ 23 this.id=id; 24 this.name=name; 25 } 26 27 /** 28 * getter和setter方法 29 */ 30 public int getId() { 31 return id; 32 } 33 public void setId(int id) { 34 this.id = id; 35 } 36 public String getName() { 37 return name; 38 } 39 public void setName(String name) { 40 this.name = name; 41 } 42 43 44 }
反射测试类:
1 package cn.jason.reflections; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 7 /** 8 * Created by Jason 2016-7-16 上午11:31:04 9 */ 10 public class TestReflect { 11 12 public static void main(String[] args) { 13 TestReflect.getproperty(); 14 } 15 16 /** 17 * 获取用户类型里面的属性以及getter好getter方法 18 */ 19 public static void getproperty(){ 20 try { 21 //第一步:获取对象类型 22 Class<?> classType=Class.forName("cn.jason.reflections.Constomer"); 23 24 //通过反射,获取用户类里面的所有属性 25 Field[] fields=classType.getDeclaredFields(); 26 27 //循环打印获取到的属性Name 28 int i=0; 29 for (Field field : fields) { 30 String name=field.getName(); 31 //System.out.println("类对象的字段名称:"+name); 32 33 //属性的第一个字母截取出来,并且大写化 34 String firstLetter=name.substring(0, 1).toUpperCase(); 35 36 //拼接属性get方法的方法名 37 String getMethodName="get"+firstLetter+name.substring(1); 38 String setMethodName="set"+firstLetter+name.substring(1); 39 //System.err.println("拼接后的方法名称:"+getMethodName+","+setMethodName); 40 41 //现在动态获取get方法 42 Method getmethod=classType.getDeclaredMethod(getMethodName, new Class[]{}); 43 44 //现在动态获取set方法 参数列表:(int id) 45 Method setmethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()}); 46 47 //通过反射来创建对象:等同于Constomer c=new Constomer(001,"Jason"):构造器-----这里的目的是获取类的对象(反射的形式获取) 48 Object obj=classType.getConstructor( 49 new Class[]{int.class,String.class}).newInstance( 50 new Object[]{18,"天使彦"}); 51 //执行get方法获取数据 空参数 52 Object value=getmethod.invoke(obj, new Object[]{}); 53 54 System.out.println("[1]执行了方法"+getMethodName+"()之后,返回结果是:"+value); 55 56 //执行set方法:2次遍历的参数类型是不一样的!所以不能写死了!否则会报参数类型错误! 57 Object[] params=new Object[1]; 58 if(i==0){ 59 params[0]=22; 60 }else{ 61 params[0]="Jason"; 62 } 63 setmethod.invoke(obj, params); 64 Object value2=getmethod.invoke(obj, new Object[]{}); 65 System.out.println("[2]执行了方法"+getMethodName+"()之后,返回结果是:"+value2); 66 67 //计数器+1 68 i++; 69 } 70 71 //获取类中的所有的方法 72 Method[] methods=classType.getMethods(); 73 for (Method method : methods) { 74 //System.err.println(method.getName()); 75 } 76 77 } catch (Exception e) { 78 e.printStackTrace(); 79 } 80 } 81 }
测试运行结果:
[1]执行了方法getId()之后,返回结果是:18 [2]执行了方法getId()之后,返回结果是:22 [1]执行了方法getName()之后,返回结果是:天使彦 [2]执行了方法getName()之后,返回结果是:Jason 下面是获取反射对象内部全部的方法 getName() getId() setName() setId() wait() wait() wait() hashCode() getClass() equals() toString() notify() notifyAll()