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 11:27:27 浏览: 26
这段代码看起来像是一个Java方法,它的作用是获取一个JoinPoint对象对应的方法上的LogAnnotation注解的描述信息。具体来说,它首先获取方法名、参数和目标类,然后通过目标类获取所有方法,遍历这些方法,找到与方法名相同且参数数量一致的方法,并获取该方法上的LogAnnotation注解的描述信息,最终返回该描述信息。
相关问题
Signature signature = joinPoint.getSignature();之后如何获取方法名,参数
您可以通过以下代码获取方法名和参数:
```
// 获取方法名
String methodName = signature.getName();
// 获取参数
Object[] args = joinPoint.getArgs();
```
如果您想获取参数的具体信息,可以使用以下代码:
```
MethodSignature methodSignature = (MethodSignature) signature;
Class<?>[] parameterTypes = methodSignature.getParameterTypes();
String[] parameterNames = methodSignature.getParameterNames();
for (int i = 0; i < parameterTypes.length; i++) {
System.out.println("参数名:" + parameterNames[i] + ",参数类型:" + parameterTypes[i].getName() + ",参数值:" + args[i]);
}
```
请注意,这些代码必须在连接点方法执行之前执行,因为它们需要从连接点的签名中提取信息。
代码实现消息消费并保存至数据库@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); }
这段代码的主要作用是将监控信息发送到 RabbitMQ 的消息队列中,而不是直接保存到数据库中。因此,我们还需要编写一个消息消费者来消费这些消息并将监控信息保存到数据库中。
下面是一个简单的消息消费者代码示例:
```java
@Component
public class MonitorMessageConsumer {
@Autowired
private MonitorMessageRepository monitorMessageRepository;
@RabbitListener(queues = "monitor.queue.test")
public void consumeMessage(Message message) {
// 将监控信息保存到数据库中
MonitorMessage monitorMessage = new MonitorMessage();
monitorMessage.setMethodName(message.getMethodName());
monitorMessage.setSource(message.getSource());
monitorMessage.setStatus(message.getStatus());
monitorMessage.setStartTime(new Date(message.getStartTime()));
monitorMessage.setEndTime(new Date(message.getEndTime()));
monitorMessageRepository.save(monitorMessage);
}
}
```
在上面的示例中,我们使用了 @RabbitListener 注解来定义一个 RabbitMQ 消息监听器,监听名为 "monitor.queue.test" 的消息队列。当有新的消息到达时,consumeMessage 方法会被自动调用,将消息中的监控信息提取出来,并将其保存到数据库中。
需要注意的是,为了将 Message 对象转换成 MonitorMessage 对象并保存到数据库中,我们需要先定义一个 MonitorMessage 实体类,并编写一个对应的 Repository 类来操作数据库。