15、反射的原理
应用在一些通用性比较高的代码中
后面学的框架,大多都是使用反射实现
* 在框架开发中,都是基于配置文件开发
** 在配置文件中配置了类,可以通过反射得到类中所有内容,可以让类中某个方法执行
* 类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法
反射原理
* 首先java保存本地.java
* 编译java文件,成.class
* 使用jvm,把class文件通过类加载器加载到内存中
* 万事万物都是对象,class文件在内存中使用class类表示
*当使用反射时候使用反射首先需要得到class类
三种方式
* 类名.class
* 对象.getClass()
* 使用Class.forName("路径")
属性 Field
构造方法 Constructor
方法 Method
16、使用反射来操作类
*首先获取到Class
* 比如要对一个类进行实例化,可以new,不使用new,怎么获取?
*没有参数
Class c3 = Class.forName();
Person p = (Person) c3.newInstance();
* 操作有参数的构造方法
//传递的是有参数构造方法里面参数类型,参数类型使用class形式传递
Constructor cs = c1.getConstructor(String.class,String.class);
//通过有参数的构造方法设置值
Person p1 = (Person) cs.newInstance("lisi","100");
18、使用反射操作属性
//操作name属性
Field f1 = c2.getDeclareField("name")
f1.set(Person实例,"wangwu");//相当于p.name = "wangwu";
如果属性是私有的
f1.setAccessible(true);//设置可以操作私有属性
19、使用发射操作方法
Method m1 = c4.getDeclaredMethod("setName",String.class);
m1.invoke(person实例,“wang”);
//操作私有方法
m1.setAccessible(true);
操作的方法是静态的方法时候,因为静态方法调用方式是类名.方法名,不需要类的实例
使用反射操作静态方法时候,也是不需要实例
- m1.invoke(null,"niuqi");//第一个参数设置null就行