1.反射概念
反射允许对成员变量,成员方法和构造方法的信息进行编程访问,通俗理解就是允许从类里面拿东西,用途有提示词等,如下所示都是通过反射实现的
所以,学习反射就是学习从字节码class文件中获取成员信息并且对其进行解剖获得更细化的信息
2.获取Class对象
- Class.forName("全类名");
- 类名.class
- 对象.getclass();
public class demo1 {
public static void main(String[] args) throws ClassNotFoundException {
Student s1 = new Student();
Class c1 = Class.forName("com.mzz.reflect.Student");
Class c2 = Student.class;
Class c3 = s1.getClass();
System.out.println(c1 == c2);
System.out.println(c1 == c3);
}
}
true
true
3.反射获取构造方法
Java之中万物皆对象,class字节码可以是class对象,构造方法是Constructor对象(在字节码文件中),成员变量是Field对象,成员方法是Method对象
public class demo2 {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("com.mzz.reflect.Student"); //全类名
Constructor[] constructors1 = c1.getConstructors();
//获取public的构造方法
for (Constructor constructor : constructors1) {
System.out.println(constructor);
}
//public com.mzz.reflect.Student(java.lang.String,int)
//public com.mzz.reflect.Student()
Constructor[] constructors2 = c1.getDeclaredConstructors();
//获取所有构造方法,包括私有
for (Constructor constructor : constructors2) {
System.out.println(constructor);
}
int modifires = c1.getModifiers();
System.out.println(modifires);
//打印为1,权限修饰符
}
}
3.反射获取成员变量
4.反射获取成员方法
5.反射案例
反射的作用:
- 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
- 结合配置文件,动态的创建对象并调用方法
案例1: 保存信息,对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去
public class Demo3 {
public static void main(String[] args) throws IOException, IllegalAccessException {
Student s= new Student("小A", 23, "女");
Teacher t = new Teacher("挑", 10000);
saveobject(s);
}
private static void saveobject(Object obj) throws IllegalAccessException, IOException {
//1.获取字节码文件的对象
Class clazz = obj.getClass();
//2.创建IO流
BufferedWriter bw = new BufferedWriter(new FileWriter("myreflect\\a.txt"));
//3.获取所有的成员变量
Field[] fields = clazz.getDeclaredFields();
for(Field field :fields) {
field.setAccessible(true);
//获取成员变量的名字
String name = field.getName();
//获取成员变量的值
Object value = field.get(obj);
//写出数据
bw.write(name + "=" + value);
bw.newLine();
}
bw.close();
}
}
6.动态代理
特点:无侵入式的给代码增加额外的功能,适用于大型项目修改代码
对象如果嫌身上干的事太多的话可以通过代理来转移部分职责,所以说对象有什么方法想被代理,代理就一定要有对应的方法,那么代理怎么知道对象有什么方法想被代理呢?实现二者的共同接口