反射:
反射(Reflection)是 Java 语言中一个非常强大的特性,它允许程序在运行时自我检查和操作。通过反射,你可以动态地获取类的信息(例如,类的构造函数、方法、字段)并可以在运行时创建对象、调用方法和访问字段。 程序运行时通过jvm的class对象获取到某类的所有方法,成员变量等。 方法:Class.forname(“路径”) 通过对该对象的class对象进行实例。
// 获取类对象 Class<?> clazz = Class.forName("com.example.MyClass"); // 获取构造方法并创建对象 Constructor<?> constructor = clazz.getConstructor(String.class); Object obj = constructor.newInstance("example"); // 获取并调用方法 Method method = clazz.getMethod("myMethod", String.class); method.invoke(obj, "hello"); // 获取并修改字段 Field field = clazz.getDeclaredField("myField"); //(设置私有字段为可修改) field.setAccessible(true); field.set(obj, "new value"); Object value = field.get(obj); System.out.println("Field value: " + value); } class MyClass { private String myField; public MyClass(String myField) { this.myField = myField; } public void myMethod(String msg) { System.out.println("MyMethod called with: " + msg); }}
动态代理:
运用反射的思想,在运行时创建对象,并将方法调用重定向到不同的实际对象。对某一类功能增强。通过代理对象可以实现横切关注点(如日志,事务管理,安全性等),与业务逻辑代码解耦。 静态代理即和需要增强的类继承同样的接口,在此中进行对其进行实例,增加业务逻辑,实际就是静态包裹 住该类。 动态代理即用proxy生成代理类实例-通过newProxyInstance()方法,代理类持有InvocationHandle类实例,InvocationHandle持有待增强类的 实例,通过调用代理类的方法(反射),InvocationHandle对此方法进行拦截,实现增强的业务逻辑,
(在其invoke方法体中 增强的业务逻辑+方法调用)处理。 其中 proxy参数:classloader 继承接口列表 handle类(调用处理器) 其中 handle中invoke参数 : proxy(代理实体) 方法 方法入参
AOP:
即动态代理思想,使用aop即定义切面,切点 aspect execution 通过在这种切面类定义此两项可以定位到需要aop的实现类 在切面类中通过注解@After等即可完成对实现类的前置后置等通知。