java.lang.reflect.Method.getAnnotation()方法示例 - java.lang.reflect包教程™ 正解 关系是这种切面的要加这个@Retention(RetentionPolicy.RUNTIME)

@Retention(RetentionPolicy.RUNTIME)
public @interface ControllerLoggerIgnore {

    public String title() default "排除";
}
@Around("@within(org.springframework.web.bind.annotation.RestController)")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {


        // 1.获取切入点所在目标对象
        Object targetObj = joinPoint.getTarget();
//        System.out.println(targetObj.getClass().getName());
        // 2.获取切入点方法的名字
        String methodName = joinPoint.getSignature().getName();
//        System.out.println("切入方法名字:" + methodName);
        // 3.获取方法上的注解
        Signature       signature       = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method          method          = methodSignature.getMethod();

        if (method != null) {
            ControllerLoggerIgnore apiLog = method.getAnnotation(ControllerLoggerIgnore.class);

            if (null != apiLog) {
                System.out.println("切入方法注解的title:" + apiLog.title());
            }

        }

        // 4.获取方法的参数
        Object[] _args = joinPoint.getArgs();
        for (Object o : _args) {
//            System.out.println("切入方法的参数:" + o);
        }


        log.info("\n开始捕获用户操作日志 aroundMethod :" +
                        "\n1.获取切入点所在目标对象 - {} " +
                        "\n2.获取切入点方法的名字  - {} " +
                        "\n3.获取方法上的注解      - {} " +
                        "\n4.获取方法的参数        - {}" +
                        "\n",
                targetObj.getClass().getName(), methodName, "", _args
        );

        SysUserOperationLogParam userOperation = new SysUserOperationLogParam();

        long startTime = 0;

        try {
            // 获取Request对象
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

            LoginSysUser loginSysUser = JwtUtil.getLoginSysUser(request);

            if (null != loginSysUser) {
                // 操作人
                userOperation.setUserName(loginSysUser.getSysUserName());
                // 操作人账号
                userOperation.setNickName(loginSysUser.getSysUserName());
            } else {
                // 操作人
                userOperation.setUserName("公司打杂");
                // 操作人账号
                userOperation.setNickName("公司打杂");
            }

            // 操作名称
            userOperation.setMethodName(joinPoint.getSignature().getName());
            // 操作时间
            Date date = new Date();
            startTime = date.getTime();

            userOperation.setOperationTime(date);
            // 请求开始时间
            userOperation.setRequestStartTime(date);
            // 请求IP
//            userOperation.setRequestIp(IPUtil.getRemoteIpAddr(request));
            // URL
            userOperation.setRequestUrl(request.getRequestURI());
            // 模块
            userOperation.setModel(model);

            Object[] args = new Object[0];

            try {
                // 请求参数 TODO 目录 系统 不统一 有的可能会报错 不用理
                args = joinPoint.getArgs();

                Integer isLogRequestParam = 0;

//                if(args instanceof java.util.logging.ErrorManager){
//                    isLogRequestParam = 1;
//                } else
                if (null != args) {

                    if (java.io.Serializable.class.isInstance(args)) {
                        isLogRequestParam = 1;
                    }

                }


                // 过滤不能序列化的
                if (isLogRequestParam.equals(1)) {
                    String param = JsonUtils.toJson(args);
                    userOperation.setRequestParam(param);
                }

            } catch (RuntimeException re) {

            } catch (Exception e) {
                log.error("截取参数异常", e);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        Object proceed = null;

        try {
            // TODO 目前这里的问题 excel 下载有问题
            proceed = joinPoint.proceed();
            userOperation.setResultStatus("success");

            return proceed;

        } catch (Exception e) {

            // 堆栈错误信息
            String stackTrace = Arrays.toString(e.getStackTrace());
            // 错误信息
            String                            message  = e.getMessage();
            ConcurrentHashMap<String, String> errorMsg = new ConcurrentHashMap<>();
            errorMsg.put("stackTrace", stackTrace);
            errorMsg.put("message", e.getClass().getName() + ": " + message);

            userOperation.setErrorInfo(JsonUtils.toJson(errorMsg));
            userOperation.setResultStatus("error");

            throw e;

        } finally {

            try {
                if (null != proceed) {
                    // 返回结果
                    userOperation.setResponseResult(JsonUtils.toJson(proceed));
                }

                // 请求结束时间
                Date endDate = new Date();
                userOperation.setRequestEndTime(endDate);
                userOperation.setResponseDate(endDate.getTime() - startTime);

            } catch (Exception e) {
                log.error("获取返回结果异常{}", e);
            }

            // 异步将操作日志保存
            CompletableFuture.runAsync(() -> {
                try {
                    // 保存日志,具体方法自定义
                    sysUserOperationLogDubboConsumerService.addSysUserOperationLog(userOperation);
                } catch (Exception e2) {
                    log.error("用户操作日记记录异常:{}", e2);
                }
            });
        }
    }

java.lang.reflect.Method.getAnnotation(Class <T> annotationClass)方法如果存在这样的注释,则返回指定类型的元素的注释,否则为null

声明

以下是java.lang.reflect.Method.getAnnotation(Class <T> annotationClass)方法的声明。

public <T extends Annotation> T getAnnotation(Class<T> annotationClass)

参数

  • annotationClass - Class对象对相应的注释类型。

返回值

  • 如果存在于此元素,则返回该元素注释指定的注释类型,否则返回为null

异常

  • NullPointerException - 如果给定的注释类为空。

以下示例显示java.lang.reflect.Method.getAnnotation(Class<T> annotationClass)方法的用法。

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

public class MethodDemo {
   public static void main(String[] args) {
      Method[] methods = SampleClass.class.getMethods();

      Annotation annotation = methods[0].getAnnotation(CustomAnnotation.class);
      if(annotation instanceof CustomAnnotation){
         CustomAnnotation customAnnotation = (CustomAnnotation) annotation;
         System.out.println("name: " + customAnnotation.name());
         System.out.println("value: " + customAnnotation.value());
      }
   }
}

@CustomAnnotation(name="SampleClass",  value = "Sample Class Annotation")
class SampleClass {
   private String sampleField;

   @CustomAnnotation(name="getSampleMethod",  value = "Sample Method Annotation")
   public String getSampleField() {
      return sampleField;
   }

   public void setSampleField(String sampleField) {
      this.sampleField = sampleField;
   } 
}

@Retention(RetentionPolicy.RUNTIME)
@interface CustomAnnotation {
   public String name();
   public String value();
}

让我们编译并运行上面的程序,这将产生以下结果 -

name: getSampleMethod
value: Sample Method Annotation

原网址: 访问
创建于: 2021-03-10 15:33:23
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论