1.什么是反射?反射的作用?
java反射,就是在运行状态中
- 获取任意类的名称,包的信息,所有属性,方法,注解,类型,类加载器、modifiers,
父类,现实接口等
- 获取任意对象的属性,并且能改变对象的属性
- 调用任意对象的方法
- 判断任意一个对象所属的类
- 实例化任意一个类的对象
java的动态就体现在反射。通过反射我们可以实现动态装备,
减低代码的耦合度;动态代理等。
不过反射的过度使用会严重消耗系统资源。
JDK中java.lang.Class类,就是为了实现反射提供的核心类之一。
一个JVM中一种Class只会被加载一次。
2.动态代理是什么?应用场景?
动态代理:在运行时,创建目标类,并可以调用和扩展目标类的方法。
JAVA中实现动态的方式:
- JDK中的动态代理
- java类库CGLib
应用场景:
- 统计每个API的请求耗时
- 统一的日志输出
- 校验被调用的API是否已经登录和权限鉴定
- Spring的aop功能模块就是采用动态的机制来实现切面编程
3.什么是AOP
AOP:Aspect Oriented Programming,面向切面编程
通过预编译和运行期动态代理实现程序功能的统一维护。
在Spring框架中,AOP是一个很重要的功能。
AOP利用一种称横切的技术,剖开对象的封装,并将影响多个类的公共行为封装到一个可重用的模块,组成一个切面,即Aspect。
“切面”就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统重复的代码,减低模块间的耦合度,利于可操作性和可维护性。
实现AOP的方式,主要有两大类:
- 采用动态代理技术,利用拦截方法的方式,对该方法进行装饰,以取代原有对象行为的执行;
- 采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关的“切面”代码。
AOP的相关概念
切面(Aspect)、连接点(Joinpoint)、通知(Advice)、切点(Pointcut)、
引入(Introduction)、目标对象(Target Object)、AOP代理(AOP Proxy)、
织入(Weaving)
spring框架中可以通过XML配置和注释去使用AOP功能
详情可以参考:
4.事务的三个并发问题
事务的并发问题是指多个用户对同一数据进行操作时出现的问题,最常见的有脏读,不可重复读,幻读
- 脏读:事务A读取了事务B更新但未提交的数据,然后事务B出现异常执行回滚操作,那么此时事务A读取的数据就是脏数据。如:在员工工资表中,张三的salary为3000,事务B更新张三的salary为5000,但并未提交;同时事务A正在读取张三的salary并且读取到的数据为5000;突然事务B出现异常执行回滚为3000,所以事务A读取的5000即为脏数据。这个问题主要是修改数据后未提交引起。
- 不可重复读:事务A多次读取同一数据,事务B在事务A读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。例如:事务A读取到张三的salary为3000,但事务A还没有提交;同时事务B把张三的salary改为5000并且提交这时事务A再次读取到张三的salary为5000。在事务A这一事务中前后读取到的数据不一致,即原始读取不可重复。这个问题主要是修改数据并提交引起
- 幻读:事务A原先读取的数据记录数为a,但此时事务B新插入或者删除一条数据 ,此时事务A读取到的数据记录数为a+1或者a-1。例如:员工表中salary为3000的有10位员工,事务A读取到的也是10位;此时,事务B新插入或者删除一位salary为3000的新员工,事务A再次读取到的记录数为11或9,相当于产生幻觉。这个问题主要是增加或删除数据引起