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.动态代理
特点:无侵入式的给代码增加额外的功能,适用于大型项目修改代码
对象如果嫌身上干的事太多的话可以通过代理来转移部分职责,所以说对象有什么方法想被代理,代理就一定要有对应的方法,那么代理怎么知道对象有什么方法想被代理呢?实现二者的共同接口