public static String getAnnotationString(JoinPoint joinPoint){ String desc = null; String methodName = joinPoint.getSignature().getName(); Object[] args = joinPoint.getArgs(); Class<?> aClass = joinPoint.getTarget().getClass(); Method[] methods = aClass.getMethods(); // System.out.println(methods); for(Method method:methods){ if(method.getName().equals(methodName)){ Class<?>[] parameterTypes = method.getParameterTypes(); if(parameterTypes.length==args.length){ LogAnnotation annotation = method.getAnnotation(LogAnnotation.class); desc = annotation.desc(); // System.out.println(desc); } } } return desc; }
时间: 2024-02-15 14:27:27 浏览: 134
这段代码看起来像是一个Java方法,它的作用是获取一个JoinPoint对象对应的方法上的LogAnnotation注解的描述信息。具体来说,它首先获取方法名、参数和目标类,然后通过目标类获取所有方法,遍历这些方法,找到与方法名相同且参数数量一致的方法,并获取该方法上的LogAnnotation注解的描述信息,最终返回该描述信息。
相关问题
根据代码消费消息并存到数据库@Order(999) @Aspect @Component public class MonitorAspect { @Autowired private RabbitTemplate rabbitTemplate; @Pointcut("@annotation(com.sinosoft.common.annotation.Monitor)") public void monitorPointcut(){} @Around("monitorPointcut()") public Object monitor(ProceedingJoinPoint joinPoint) throws Throwable { // 获取方法参数和注解信息 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Object[] args = joinPoint.getArgs(); Monitor monitor = method.getAnnotation(Monitor.class); // 记录监控信息 String serviceName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); String source = args.length > 0 ? args[0].toString() : ""; long startTime = System.currentTimeMillis(); int status = 200; Object result = null; try { result = joinPoint.proceed(); } catch (Exception e) { status = 500; throw e; } finally { long endTime = System.currentTimeMillis(); monitor(serviceName, source, status, startTime, endTime); } // 返回方法结果 return result; } private void monitor(String serviceName, String source, int status, long startTime, long endTime) { // 记录监控信息 Message message = new Message(); message.setMethodName(serviceName); message.setSource(source); message.setStatus(status); message.setStartTime(startTime); message.setEndTime(endTime); // 发送消息到MQ rabbitTemplate.convertAndSend("monitor.queue.test", "monitorRoutingKey", message); }
这段代码使用了 AOP 切面技术,通过 @Aspect 和 @Pointcut 注解定义了一个切面,用来监控被 @Monitor 注解标记的方法的执行情况。在切面的 monitor 方法中记录了被监控方法的名称、参数、开始和结束时间等信息,并将这些信息封装成一个 Message 对象,通过 RabbitMQ 的消息队列发送出去。这样就可以将监控信息异步地存储到数据库中,而不会影响被监控方法的执行效率。
按下面代码统计接口调用的次数:@Order(999) @Aspect @Component public class MonitorAspect { @Autowired private RabbitTemplate rabbitTemplate; @Pointcut("@annotation(com.sinosoft.common.messagestorage.annotation.Monitor)") public void monitorPointcut(){} @Around("monitorPointcut()") public Object monitor(ProceedingJoinPoint joinPoint) throws Throwable { // 获取方法参数和注解信息 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Object[] args = joinPoint.getArgs(); ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); Monitor monitor = method.getAnnotation(Monitor.class); // 记录监控信息 String requestUrl = requestAttributes.getRequest().getRequestURI(); String serviceName = method.getDeclaringClass().getSimpleName() + "." + method.getName(); String source = args.length > 0 ? args[0].toString() : ""; long startTime = System.currentTimeMillis(); int status = 200; Object result = null; try { result = joinPoint.proceed(); } catch (Exception e) { status = 500; throw e; } finally { long endTime = System.currentTimeMillis(); monitor(serviceName, source, status, startTime, endTime); } // 返回方法结果 return result; } private void monitor(String serviceName, String source, int status, long startTime, long endTime) { // 记录监控信息 Message message = new Message(); message.setServiceName(serviceName); message.setSource(source); message.setStatus(status); message.setStartTime(startTime); message.setEndTime(endTime); // 发送消息到MQ rabbitTemplate.setExchange("monitor.queue.test"); rabbitTemplate.setRoutingKey("monitorRoutingKey"); rabbitTemplate.convertAndSend(message); // rabbitTemplate.convertAndSend("monitor.queue.test", "monitorRoutingKey", message); } }
这段代码是一个 Spring AOP 切面,用于统计被 @Monitor 注解标记的方法的调用次数以及调用时间等信息,并将这些信息记录到 RabbitMQ 中。
具体实现方式是,在切面的 monitor 方法中,获取被注解的方法的相关信息,包括方法名、参数、注解信息等,然后记录调用开始时间,执行被注解的方法,记录调用结束时间,最终将这些信息封装成一个 Message 对象,通过 RabbitMQ 发送出去。
需要注意的是,这段代码中用到了 RabbitMQ 的相关 API,需要先配置好 RabbitMQ 的连接和 Exchange、Queue。
阅读全文