AOP (Aspect-Orient Programming) Aspect:方面 Aspect-Orient:面向方面的 ,直翻过来 面向切面的编程. OOP:Object-Oriented Programming面向对象编程
面向对象编程是将程序抽象为各层次的对象,面向切面编程是将程序抽象为各切面的编程
javac编译
javapC:\Users\wcx\Desktop\git\JVM
开发过程中多个模块之间有重复的代码怎么处理,新增了一个需求,需要再多出做修改,我们需要再抽象出一个方法,然后再在需要的地方分别调用这个方法,又或者我们不需要这个方法了,我们还是得删除掉每一处调用该方法的地方。实际上涉及到多个地方具有相同的修改的问题我们都可以通过 AOP 来解决。
反射
反射:1.给定的一个类,通过反射获取到这个类(class)对象所有成员结构
2.给定一个具体的对象,能够动态地调用它的方法及对任意属性值进行获取和赋值
获取对象实例的四种方法
常见的获取类锁包含的信息
Fileld属性
反射对字段常用的操作
Field[] fields = clazz.getFields(); // 获取类中所有的公有字段 Field[] declaredFields = clazz.getDeclaredFields(); // 获取类中定义的字段 Field nameField = clazz.getField("name"); // 获取指定名称的公有字段 Field declaredField = clazz.getDeclaredField("likeDesc"); // 获取指定名称类中定义的字段 int modifiersField = likeDescField.getModifiers(); // 获取字段的修饰 nameField.setAccessible(true); // 指定字段强制访问 nameField.set(person, "hncboy"); // 成员字段赋值(需指定对象) descriptionField.set(null, "hncboy"); // 静态字段赋值
实战
反射对方法的常用操作
Method[] methods = clazz.getMethods(); // 获取类中所有的公有方法 Method[] declaredMethods = clazz.getDeclaredMethods(); // 获取本类的所有方法 Method talkMethod = clazz.getMethod("talk", String.class); // 获取类中指定名称和参数的公有方法 Method pugMethod = clazz.getDeclaredMethod("pickUpGirls"); // 获取本类中定义的指定名称和参数的方法 int modifiers = pugMethod.getModifiers(); // 获取方法的修饰符 talkMethod.invoke(boy, "I tell you"); // 指定对象进行成员方法的调用 pugMethod.setAccessible(true); // 指定方法的强制访问 pickUpGirlsMethod.invoke(null); // 指定静态方法的调用
instance:实例
实战
反射对构造器的方法
Constructor<?>[] constructors = clazz.getConstructors(); // 获取类中所有的公有构造器 Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors(); // 获取类中所有的构造器 Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(); // 获取类中无参的构造器 Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, String.class); // 获取类中有参构造器 int modifiers = constructor.getModifiers(); // 获取构造器的修饰符 declaredConstructor.newInstance(); // 构造器实例对象 declaredConstructor.setAccessible(true); // 指定构造器的强制访问 constructor.newInstance("hncboy"); // 有参构造调用 clazz.newInstance(); // 直接调用默认无参构造
实战反射构造器
代理
都是就是你委托别人帮你办事,所以代理模式也有人称作委托模式的。
代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
静态代理:
动态代理:
Invoke:调用
JDK 动态代理:利用反射机制生成一个实现代理接口的类,在调用具体方法前调用InvokeHandler来处理。
重写里面的invoke方法
CGlib 动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
enhancer:增强器
Intercerptor:拦截器
AOP分为动态AOP,静态AOP
静态AOP:在生成.class文件之前已经被修改掉了,需要使用特定的编译器比如AspectJ
动态AOP: AOP在运行的时候生成动态的对象(在内存中以JDK代理对象,或者GCLib动态的生成AOP代理类),如SpringAOP