2020年7月13日

Java反射机制

作者 Sheclock

一、什么是Java反射机制就是正在运行,动态获取这个类的所有信息。
二、反射机制的作用 1,反编译:.class–>.java   2.通过反射机制访问java对象的属性,方法,构造方法等;
三、反射机制的应用场景
JDBC加载驱动、Spring IOC、框架、设计模式
四、反射机制获取类 //第一种方式:          Classc1 = Class.forName(“Employee”);          //第二种方式:          //java中每个类型都有class 属性.          Classc2 = Employee.class;                     //第三种方式:          //java语言中任何一个java对象都有getClass 方法          Employeee = new Employee();          Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 
五、反射机制创建对象方式1. 无参构造函数 //newInstance使用无参构造函数 创建对象。 //forName 必须传入class类的完整路径。 Class<?> c = Class.forName(“entity.User”); Object newInstance = c.newInstance(); User user = (User) newInstance; user.setName(“张三”); System.out.println(user.getName()); 2. 有参构造函数//newInstance使用有参构造函数 创建对象。 Class<?> c = Class.forName(“entity.User”); Constructor<?> con = c.getConstructor(String.class,int.class,String.class); Object newInstance = con.newInstance(“张三”,22,”男”); User user = (User)newInstance; System.out.println(user.getName()+user.getAge()+user.getSex());
六、反射api

方法名称作用
getDeclaredMethods []获取该类的所有方法
getReturnType()获取该类的返回值
getParameterTypes()获取传入参数
getDeclaredFields()获取该类的所有字段
setAccessible允许访问私有成员

七、使用反射为类私有属性赋值

Class c = Class.forName("entity.User");
Field field = c.getDeclaredField("name");
Object object = c.newInstance();
field.setAccessible(true);
field.set(object, "张三");
User user = (User)object;
System.out.println(user.getName());

//通过java反射机制输出私有属性值
Class c = Class.forName("entity.User");
Constructor con = c.getConstructor(String.class,int.class,String.class);
Object newInstance = con.newInstance("张三",22,"男");
Field field = c.getDeclaredField("name");
field.setAccessible(true);
System.out.println(field.getName()+"-----------"+field.get(newInstance));