反射***
应用在一些通用性比较高的代码中
后面的学到的框架,大多数都是用使用反射来实现(面试题)
菜鸟与骨灰级区别 代码的命名方式 ; debug调试 ;对反射的理解程度
在框架开发中,都是基于配置文件开发的
再配置文件中配置配置了类,可以通过反射得到类中的 所有内容 ,可以让类中的某个方法来执行
类中的所有内容 属性 没有参数的构造方法 有参数的构造方法、普通方法
画图分析反射原理
首先把java文件保存到本地硬盘
编译 成class文件
使用jvm 把class 文件通过类加载器加载到内存中
万事万物皆对象 class文件在内存中使用class类表示
当使用反射的时候 首先获取到class类 得到这个类之后,就可以 得到class文件的所有内容
- 包含属性 构造方法 普通方法
属性通过一个类 Filed
构造方法 通过一个类 Constructor
普通方法 通过一个类 Method
16使用反射操作类里面的属性
首先获取到class类
//获取Class类 三种方式
Class class1 = Person.class; Class class2 = new Person().getClass(); Class class3 = Class.forName("cn.itcast.test09.Person");
比如 要对一个类进行实例化 可以用new 不使用new 怎么获取 ?
//得到Class
Class c3 = Class.forName("cn.itcast.test09.Person");
//得到Person类的实例
Person p = (Person) c3.newInstance();
Person类
package cn.itcast.test09; public class Person { //属性 private String name; private String id; //没有参数的构造方法 public Person(){} //有参数的构造方法 public Person(String name, String id) { super(); this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
//使用泛型操作普通方法 setName //使用Method类表示普通方法 @Test public void test4() throws Exception { //得到Class类 Class c4 = Class.forName("cn.itcast.test09.Person"); //得到Person实例 Person p4 = (Person) c4.newInstance(); //得到普通的方法 //c4.getDeclaredMethods();//得到所有的普通方法 用的很少 //下面方法解析 传递两个参数,第一个参数,方法名称;第二个参数 ,通过方法设置的值 Method m1 = c4.getDeclaredMethod("setName",String.class); //若操作的是私有方法,需要来设置值为true m1.seAccessible(true); //让setName方法执行 ,执行设置值 //invoke(p4,"niuqi") 传递两个参数 第一个参数 Person的一个实例,第二个参数,设置的值 m1.invoke(p4, "niuqi"); System.out.println(p4.getName()); //当操作的方法是静态方法的时候,因为静态方法调用的方式是 类名,不需要类的实例 //使用反射操作静态方式的时候,也是不需要实例 m1.invoke(null,"niuqi") }
//操作name属性 @Test public void test3(){ try{ //得到class类 Class c2 = Class.forName("cn.itcast.test09.Person"); //得到name属性 Person p11 = (Person) c2.newInstance(); //c2.getDeclaredFields();//表示得到所有的属性//用的很少 了解就行 Field f1 = c2.getDeclaredField("name"); //设置可以操作私有的属性 f1.setAccessible(true); //设置name值 f1.set(p11,"wangwu"); //相当于 p.name = "wangwu"; System.out.println(f1.get(p11)); //相当于p.name }catch (Exception e) { e.printStackTrace(); } }
//操作有参数的构造方法 @Test public void test2() throws Exception{ //得到Class Class c1 = Class.forName("cn.itcast.test09.Person"); //使用有参数的构造方法 //c1.getConstructors();//获取所有的构造方法 这个方法 //传递的是有参数的构造方法里面的参数类型 ,类型使用class形式传递 Constructor cs = c1.getConstructor(String.class,String.class); //通过有参数的构造方法里面的参数类型,类型使用class形式传递 Person p1 = (Person) cs.newInstance("lisi","100"); System.out.println(p1.getName() + " " + p1.getId()); } //操作无参数构造方法 @Test public void test1() throws Exception{ //得到Class Class c3 = Class.forName("cn.itcast.test09.Person"); //得到Person类的实例 Person p = (Person) c3.newInstance(); //设置值 p.setName("zhangsan"); System.out.println(p.getName()); }