自我反省,好久没更新了
动态语言
动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C、C++则不属于动态语言。从反射角度说JAVA属于半动态语言。
反射
反射机制概念(运行状态中知道类所有的属性和方法)
在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。
获取对象的3个方法+创建对象的2个方法(不赘述了)
反射的用法之一 ————注解
当使用@interface创建注解类的时候,需要有注解处理器实现注解的具体功能。(仅以我所在项目为例)
首先需要设置一个切入点,作为跟注释类的联系
// 设置切入点(切面)
@Pointcut("@annotation(‘注释类地址’)")
public void aspect(){ }
//配置前置通知,使用在方法aspect()上注册的切入点
//同时接受JoinPoint切入点对象,可以没有该参数
@Before("aspect()")
public void before(){
}
//配置后置通知,使用在方法aspect()上注册的切入点
@After("aspect()")
public void after(JoinPoint joinPoint){
}
//最终通知
//returning能够将目标方法的返回值传到切面增强方法里
//声明rvt时指定的类型会限制目标方法必须返回指定类型(String)的值或没有返回值
//此处将rvt的类型声明为Object,意味着对目标方法的返回值不加限制
@AfterReturning(pointcut ="aspect()")
public void afterReturning(JoinPoint joinPoint)throws Throwable {
}
//异常通知
//声明e时指定的类型会限制目标方法必须抛出指定类型的异常
//此处将e的类型声明为Throwable,意味着对目标方法抛出的异常不加限制
@AfterThrowing(pointcut="aspect()")
public void afterThrowing(){
}
//@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。
@Around("aspect()")
public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
//获取自定义注解里面的值
Method method = ((MethodSignature)joinPoint.getSignature()).getMethod();
// 这里就是利用反射机制,获取注释类
SysLog logAnnotation = (SysLog)method.getAnnotation(SysLog.class);
}
从增强处理到JoinPoint 和 ProceedingJoinPoint 区别(更新于2023.01)
起因:需要在注解处的方法完成后向目标用户发送短信。发现对after afterReturning around等 和 JoinPoint ProceedingJoinPoint之间的关系仍然不是很清楚。
@before @after @afterRerurning @afterThrowing作为几个增强处理的注释,通常需要指定一个value属性值,该属性指定一个切点表达式(既可以是一个已有的切入点,也可以直接定义切入点表达式),用于指定该增强处理将被织入哪些切入点。同时,这些注解会定位该方法在切面方法的什么时机执行。
前置通知(Before Advice)
在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在aop:aspect里面使用aop:before元素进行声明。
后置通知(After Advice)
当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext 中在aop:aspect里面使用aop:after元素进行声明。
返回后通知(After Return Advice)
在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext 中在aop:aspect里面使用元素进行声明。
异常通知(After Throwing Advice)
在 方 法 抛 出 异 常 退 出 时 执 行 的 通 知 。 ApplicationContext 中 在 aop:aspect 里 面 使 用aop:after-throwing元素进行声明。
环绕通知(Around Advice)
类似于after+before的合体。前面的所有增强方法,只能用JoinPoint入参,而around可以用ProceedingJoinPoint。通过ProceedingJoinPoint来确定切面方法的发生时机。ApplicationContext 中在aop:aspect里面使用aop:around元素进行声明。
JoinPoint对象封装了SpringAop中切面方法的信息, 在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息。
ProceedingJoinPoint是继承JoinPoint的子接口,新增了两个用于执行连接点方法的方法。
注释的元注解
元注解的作用是负责注解其他注解。 Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。