反射的原理 (检验一个程序员是菜鸟,还是高级,有三个标准,命名方式,bug调试,对反射的理解程度)
》应用在一些通用性比较高的代码中
》后面学到的框架,大多数都是使用反射来实现的
》在框架的开发中,都是基于配置文件开发的,在配制文件中配置了类或类中的方法,可以通过反射得到类中的,所有内容,可以让类中的某个方法来执行。
** 类中的所有内容: 属性 ,没有参数的构造主法,有参数的构造方法,普通方法
使用Class 得到这个类中的所有的内容,属性 构造方法 普通方法
使用反射的三种方式 { 1, 类名.class
2.对象.getClass()
3.使用Class.forName("路径+类名")
使用反射操作构造方法
示例:
Class clazz1 = Person.Class;
Class clazz2 = new Person().getClass();
Class clazz2 = new.forName("cn.day103.Person");
》不用使用 new 来实例化类操作 无参数构造方法
Class clazz2 = new.forName("cn.day103.Person");
(Person) clazz2.getDeclaredConstructor().newInstance(); // jdk 9 及以上版本,推荐用 这个方法
(Person) clazz2.newInstance(); //jdk 9 以下版本用 这个方法
》操作 有参数的构造方法
Class clazz2 = new.forName("cn.day103.Person");
Constructor cs = class2.getConstructor(String.class,String.class);
//String 为实现类的,类型, class 为格式, 如果是传入int类型,则为,int.class
Person p1 = (Person) cs.newInstance("lishi","100");
getName() //获取
》操作类的属性
Class c2 = new.forName("cn.day103.Person");
c2.getDeclaredFields(); // 得到所有的属性
Field f1 = c2.getDeclaredFields("name"); //得到name 属性
//设置name的值
Person p1 = (Person) cs.newInstance();
f1.setAccessible(true);//设置可以操作私有属性
f1.set(p1, "wangwu"); 相当于在p.name = "wangwu";
》使用泛型操作普通方法
Class c2 = new.forName("cn.day103.Person");
c2.getDeclaredMethods(); //得到所有的方法
Method m1 = c2.getDeclaredMethods("setName","String.class"); // 得到setName方法
Person p1 = (Person) cs.newInstance();
m1.invoke(p1,"李明"); 往setName方法设置一个值
p1.getName() // 看看是否有这个值
操作静态方法