java 反射
前言
反射是一切框架的基础,当需要在程序运行时获取对象的构造函数、属性、方法时需要用到反射。
反射的三种方式
三种方式比较起来常用第三种
1.1 Student student=new Student();
Class clazz=student.getClass();
1.2 Class clazz=Class.forName("com.zhangfei.Student");
1.3 Class clazz=Student.class;
反射获取构造函数
Class clazz=Class.forName("com.zhangfei.Student"); Constructor[] cons=clazz.getConstructors(); System.out.println("获取公共的构造函数========="); for(Constructor con:cons){ System.out.println(con); } System.out.println("获取所有的构造函数,包括共有,私有、受保护的========="); cons=clazz.getDeclaredConstructors(); for(Constructor con:cons){ System.out.println(con); } System.out.println("1、调用公共构造函数创建一个对象========"); Constructor constructor=clazz.getConstructor(null); Student student=(Student) constructor.newInstance(); System.out.println("2、调用包含一个参数的公共构造函数创建一个对象========="); constructor=clazz.getConstructor(String.class); student=(Student)constructor.newInstance("zhangfei");
反射获取属性
Field[] fields=clazz.getFields(); System.out.println("3、获取共有属性======="); for(Field f:fields){ System.out.println(f); } fields=clazz.getDeclaredFields(); System.out.println("4、获取所有属性包括共有、私有、受保护的======="); for(Field f:fields){ System.out.println(f); } System.out.println("5、给私有属性name赋值:========="); Field field=clazz.getDeclaredField("id"); field.setAccessible(true); field.set(student,1); Field field2=clazz.getDeclaredField("name"); field2.setAccessible(true); field2.set(student,"zhangfei"); Field field3=clazz.getDeclaredField("age"); field3.setAccessible(true); field3.set(student,30); System.out.println(student.toString());
反射获取方法
这里获取共有方法时会把继承自object对象的方法也获取到。
System.out.println("6、获取公有方法==============="); Method[] methods=clazz.getMethods(); for(Method method:methods){ System.out.println(method); } System.out.println("7、获取所有方法,包括公有、私有、受保护的方法========"); methods=clazz.getDeclaredMethods(); for(Method method:methods){ System.out.println(method); } System.out.println("8、调用共有方法并调用======="); Method method=clazz.getMethod("show1"); method.setAccessible(true); method.invoke(student); System.out.println("9、调用受保护的方法并且传参======="); method=clazz.getDeclaredMethod("show2",String.class); method.setAccessible(true); method.invoke(student,"zhangfei");