[TOC]
反射
反射
Java是面向对象语言,Java编译生成的字节码文件应该也是一个对象,而这个对象不需要我们定义,
Java已经事先定义好了一个类叫做Class
Class类是用来描述现实事物的,是Java语言的最基本单位,类作为一个概念存在,概念本身也是一个对象
而我们使用Class类来描述这个概念类
反射的好处: 通过反射技术可以获取到字节码文件对象,
使用这个字节码文件对象就可以获取到一个类的所有信息,包括私有
【构造方法对象,成员变量对象,成员方法对象,访问权限修饰符对象...】
之前的做法:
Student s = new Student();
学习反射之后的做法: 可以不需要显示地出现学生类就能够创建学生类的对象,并且可以动态创建对象,动态赋值,动态调用方法
相关对象
Class 类对象
Constructor 构造方法对象
Method 成员方法对象
Field 成员变量对象
Modifier 访问权限修饰符对象
Array 数组对象
如何获取到堆区中的字节码文件对象?
三种方式:
1.通过Object类的getClass方法
缺陷: 必须要显示创建对象才能够获取到对应的字节码文件对象
2.通过数据类型的class属性
缺点: 必须在代码中进行硬编码,当生产环境下切换类的时候需要修改源代码
优点:
1.不需要创建对象
2.当一个方法的形参需要我们传入的是一个Class类型的时候,可以用方式二,很方便
public void method(Class c){}
method(Student.class);
3.通过Class类的一个静态方法 Class.forName()
static Class<?> forName(String className)
java.lang.ClassNotFoundException: Student
通过反射获取构造方法对象
Constructor<?>[] getConstructors() 获取到所有公有修饰的构造方法对象数组
Constructor<?>[] getDeclaredConstructors() 获取所有构造方法对象数组,包括私有
Constructor<T> getConstructor(Class<?>... parameterTypes) 获取单个公有修饰构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取所有单个修饰的构造方法对象,包括私有
通过反射获取成员变量对象
Field
Field[] getFields() 获取所有公有的成员变量对象,包括父类的公有成员
Field[] getDeclaredFields() 获取所有本类的成员,包括私有
Field getDeclaredField(String name) 获取公有的成员属性,包括父类
Field getField(String name) 获取所有本类属性,包括私有
通过反射获取成员方法对象,并且调用
Method[] getMethods() 获取所有公有修饰的成员方法对象,包括父类公有方法
Method[] getDeclaredMethods() 获取本类所有成员方法对象,包括私有方法
Method getMethod(String name, Class<?>... parameterTypes)
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
通过反射读取配置文件,动态地调用任意对象的任意方法
动态创建对象,动态调用方法
- StudentManager
- TeacherManager
通过反射获取数组对象并且赋值
- Array
动态代理
动态代理
动态代理的本质就是在代理对象方法调用之前或者之后加入一些通用的方法
面向切面编程就是代理模式的应用,也是AOP的基础
面向切面编程是面向对象的一种方式,在代码的执行过程当中,动态嵌入其他代码,成为面向切面编程
常见的应用场景:
1.日志
2.事物
3.数据库操作
面向切面编程的几个概念:
AOP本质就是动态代理
1.切点(PointCut): 要对哪些连接点进行拦截的定义,即要添加代码的地方 例如info作为切点
2.连接点(JointPoint): 类里面可以被增强的方法,这些方法称为连接点 (例如: info run add 三个连接点)
3.增强(通知)(Advice): 指的是拦截到JoinPoint之后所要做的事情就是通知,即向切点插入的代码片段称为通知
通知的分类: 前置通知,后置通知,异常通知,最终通知,环绕通知(后面讲解)
4.目标对象(Target): 代理的目标对象,这里就是target
5.织入(Weaving): 是把增强应用到目标的过程,即Advice应用到Target的过程
6.代理(Proxy): 一个类被AOP织入增强后,就会产生一个结果代理类
7.引介: 引介是一种特殊的通知在不修改源代码的前提下,可以在运行时期为类动态地加入一些方法或者字段
代理模式
代理模式: 23种设计模式的一种
静态代理
动态代理
通过代理对象,去控制对真实对象的访问
例如: 经纪人, 租房的中介
代理模式的作用: 可以通过代理对象去控制真实对象中的方法,代理对象就可以具备调用真对象的所有方法的调用控制权
我们就可以在调用方法之前做一些前置处理,之后做一些后置处理
动态代理:可以在不在修改源代码的基础动态地加入代码
租房: 1.看安居客app
2.到处走走看看
3.谈价钱....
中介来处理
存在真实对象的引用
1.看安居客app
2.到处走走看看
3.谈价钱....
4.过来交钱
5.后续合作
这些方法设计成为接口
为什么称为静态代理?
这里的代理对象由我们自己来实现的,而JDK中提供了一个类Proxy类能够动态地帮助我们创建代理对象或者代理类
Proxy.getProxyClass(loader, interfaces) 动态获取代理类
Proxy.newProxyInstance(loader, interfaces, h) 动态获取代理对象