代码地址:java 反射
一、反射原理
(day04reflection)
-
框架大多数使用反射实现。在框架开发中,都是基于配置文件开发。
-
在配置文件中配置了类,可以通过反射得到类中所有内容,或者让类中的某个方法执行。
(类中所有内容:属性、无参构造、有参构造、方法)
-
-
反射的原理
一个java文件的编译过程:
Class类:class字节码文件在内存中的表示
如果得到了Class类,则可以得到其中的所有内容。所以需要使用反射
有三种方式得到Class类。
- 类名.class
- 对象.getClass()
- 使用class.forName(“路径”)
其中class文件中的属性、构造、方法)分别被表示为Field、Constructor、Method这几个类。
二、使用反射操作类
- 获取Class类
Class class1 = Person.class; // 类名.class
Class class2 = new Person().getClass(); //对象.getClass()
Class class3 = Class.forName("day04reflection.Person");
//使用class.forName("路径")
- 操作无参构造方法
Class class1 = Class.forName("day04reflection.Person");
//得到Person实例
Person person = (Person) class1.newInstance();
person.setAge(2);
System.out.println(person.getAge());
- 操作有参构造
Class class1 = Class.forName("day04reflection.Person");
//class1.getConstructors(); //获取所有构造方法
Constructor c1 = class1.getConstructor(String.class,int.class,String.class);
Person person = (Person) c1.newInstance("zhang",23,"99");
System.out.println(person.toString());
- 操作属性
try {
Class class1 = Class.forName("day04reflection.Person");
//class1.getDeclaredFields();//得到所有属性
Person person = (Person) class1.newInstance();
Field name = class1.getDeclaredField("name");
//设置可以操作私有属性/方法
name.setAccessible(true);
name.set(person,"Chapman");
System.out.println(person.getName());
} catch (Exception e) {
e.printStackTrace();
}
- 操作普通方法
Class class1 = Class.forName("day04reflection.Person");
Method setName = class1.getDeclaredMethod("setName", String.class);
Person person = (Person) class1.newInstance();
setName.invoke(person,"right");
- 操作静态方法,方法的第一个参数为null
Class class1 = Class.forName("day04reflection.Person");
Method setName = class1.getDeclaredMethod("statics", String.class);
Person person = (Person) class1.newInstance();
setName.invoke(null,"right");