文章目录
I 反射和动态代理的区别
反射是只读
动态代理可以修改
动态代理的应用场景:过滤器是基于方法回调实现的,拦截器是基于动态代理(底层是反射)实现的 AOP;
反射用于获取某个包下面类的信息:比如获取特定包下的枚举信息,提供接口给前端使用。
1.1 AOP 常见实现技术
- 静态代理:静态代理是一种在编译时就已经确定代理关系的代理方式。在静态代理中,
代理类和被代理类都要实现同一个接口或继承同一个父类,代理类中包含了被代理类的实例,并在调用被代理类的方法前后执行相应的操作
。静态代理的优点是实现简单,易于理解和掌握,但是它的缺点是需要为每个被代理类编写一个代理类,当被代理类的数量增多时,代码量会变得很大。 - 动态代理:动态代理是一种在运行时动态生成代理类的代理方式。在动态代理中,代理类不需要实现同一个接口或继承同一个父类,而是通过
Java 反射机制动态生成代理类,并在调用被代理类的方法前后执行相应的操作
。动态代理的优点是可以为多个被代理类生成同一个代理类,从而减少了代码量,但是它的缺点是实现相对复杂,需要了解 Java 反射机制和动态生成字节码的技术。
1.2 在同一个类中调用,异步方法仍然是同步执行的。
异步方法必须要被其它类中的方法调用
在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的 。