022.自定义注解 缺乏、安全感 2021-10-06 15:40 196阅读 0赞 注解是Jdk1.5新增新技术。很多框架为了简化代码,都会提供有些注解。 可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。 -------------------- #### 定义 #### Java文件中叫做Annotation,用@interface表示。 -------------------- #### 元注解 #### @interface上面按需要注解上一些东西, 包括 **@Retention**、**@Target**、**@Document**、**@Inherited**四种。 -------------------- #### 注解的保留策略 #### // 注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.SOURCE) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得 @Retention(RetentionPolicy.CLASS) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到 @Retention(RetentionPolicy.RUNTIME) -------------------- #### 注解的作用目标 #### // 接口、类、枚举、注解 @Target(ElementType.TYPE) // 字段、枚举的常量 @Target(ElementType.FIELD) // 方法 @Target(ElementType.METHOD) // 方法参数 @Target(ElementType.PARAMETER) // 构造函数 @Target(ElementType.CONSTRUCTOR) // 局部变量 @Target(ElementType.LOCAL_VARIABLE) // 注解 @Target(ElementType.ANNOTATION_TYPE) // 包 @Target(ElementType.PACKAGE) -------------------- #### 注解包含在javadoc中 #### @Documented -------------------- #### 注解可以被继承 #### @Inherited -------------------- #### 通过注解进行校验 #### ##### demo1 ##### package cn.qbz.thread.day1121; import java.lang.annotation.*; @Documented @Inherited @Target({ ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface UserAnnotation { int min() default 0; int max() default 120; boolean isNotNull() default true; } package cn.qbz.thread.day1121; public class User { @UserAnnotation(isNotNull = true) private String name; @UserAnnotation(min = 18, max = 50) private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } package cn.qbz.thread.day1121; import java.lang.reflect.Field; public class UserCheck { public static boolean check(User user) throws Exception { if (user == null) { System.out.println("user is null."); return false; } Field[] fields = User.class.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); UserAnnotation userAnnotation = field.getAnnotation(UserAnnotation.class); String name = field.getName(); Object value = field.get(user); int min = userAnnotation.min(); int max = userAnnotation.max(); boolean isNull = userAnnotation.isNotNull(); if (isNull) { if (value == null) { throw new Exception(name + " is null."); } int length = value.toString().length(); if (length < min) { throw new Exception(name + " length min is " + min); } if (length > max) { throw new Exception(name + " length max is " + max); } } } return true; } } package cn.qbz.thread.day1121; public class AnnotationTest { public static void main(String[] args) throws Exception { User user = new User(); user.setAge(3); user.setName("sdfaf"); UserCheck.check(user); } } ##### demo2 ##### <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> package com.antzb.chaos.annotations; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.antzb.chaos.constant.ConstantKey; import com.antzb.chaos.utils.CommonUtil; import org.springframework.util.StringUtils; import javax.validation.Constraint; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.Payload; import java.lang.annotation.*; import java.util.ArrayList; import java.util.List; /** * @Author: qubianzhong * @Date: 18-4-12 下午1:38 */ @Documented @Target({ ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = ProjectUpdateTemplate.OrderByValidator.class) public @interface ProjectUpdateTemplate { String message() default "[任务步骤格式有误!]"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; class OrderByValidator implements ConstraintValidator<ProjectUpdateTemplate, JSONObject> { @Override public void initialize(ProjectUpdateTemplate projectUpdateTemplate) { } @Override public boolean isValid(JSONObject template, ConstraintValidatorContext context) { context.disableDefaultConstraintViolation(); boolean isRight = true; String errorMessage = ""; if (template != null && template.size() > 0) { for (String key : template.keySet()) { JSONObject element = template.getJSONObject(key); if (element == null) { isRight = false; errorMessage = "任务步骤序号异常!必须为:1,2,3,4的字符串."; break; } } } else { isRight = false; errorMessage = "任务步骤不能为空"; } context.buildConstraintViolationWithTemplate(errorMessage).addConstraintViolation(); return isRight; } } } public class ProjectUpdateTemplateReq { @NotNull private Integer projectInfoId; @ProjectUpdateTemplate private JSONObject stepTemplate; public Integer getProjectInfoId() { return projectInfoId; } public void setProjectInfoId(Integer projectInfoId) { this.projectInfoId = projectInfoId; } public JSONObject getStepTemplate() { return stepTemplate; } public void setStepTemplate(JSONObject stepTemplate) { this.stepTemplate = stepTemplate; } } @PostMapping public ResultMessage updateProjectOfTemplate(@Valid @RequestBody ProjectUpdateTemplateReq projectUpdateTemplateReq) { } ##### demo3 ##### package com.rongyi.smart.web.checker.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface CheckLogin { } package com.antzb.chaos.www.aspect; import com.antzb.chaos.annotations.CheckLogin; import com.antzb.chaos.constant.ConstantKey; import com.antzb.chaos.www.util.JwtTokenUtil; import io.jsonwebtoken.Claims; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.sql.Timestamp; /** * @Author: qubianzhong * @Date: 18-5-4 上午10:01 */ @Component @Aspect public class CheckLoginAspect { @Pointcut("@annotation(checkLogin)") public void checkLoginPointCut(CheckLogin checkLogin) { } @Before("checkLoginPointCut(checkLogin)") public void doBefore(JoinPoint joinPoint, CheckLogin checkLogin) { String message = "请扫码登录后重新访问!"; ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = sra.getRequest(); request.setAttribute(ConstantKey.HTTPSERVLETREQUEST_ATTRIBUTES_CHECKLOGIN, true); String token = request.getHeader(ConstantKey.JWT_HEADER_KEY); if (token == null) { throw new SecurityException(message); } Claims claims = JwtTokenUtil.getClaimsFromToken(token.replace(ConstantKey.JWT_TOKENHEAD_KEY, "")); if (claims == null) { throw new SecurityException(message); } Object userName = claims.get(JwtTokenUtil.CLAIM_KEY_USERNAME); Object userId = claims.get(JwtTokenUtil.CLAIM_KEY_USERID); Timestamp expirationTime = new Timestamp(claims.getExpiration().getTime()); if (userId == null || userName == null || expirationTime == null || expirationTime.before(new Timestamp(System.currentTimeMillis()))) { throw new SecurityException(message); } } @After("checkLoginPointCut(checkLogin)") public void doAfter(CheckLogin checkLogin) { } } @GetMapping("/task/list") @CheckLogin public ResultMessage queryProjectTaskList() { ResultMessage resultMessage = new ResultMessage(); //...... return resultMessage; }
相关 自定义注解 自定义注解关键词 @interface。具体实现可参考下面代码。 @Target({ ElementType.FIELD}) @Retention(Reten 本是古典 何须时尚/ 2022年12月05日 09:59/ 0 赞/ 191 阅读
相关 自定义注解 目录 什么是注解 自定义注解 使用注解 -------------------- 什么是注解 注解是一种能被添加到java代码中的元数据,类、方法、变量、 た 入场券/ 2022年11月20日 08:04/ 0 赞/ 199 阅读
相关 自定义注解 1、简单介绍注解 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明 旧城等待,/ 2022年10月09日 03:11/ 0 赞/ 184 阅读
相关 自定义注解 什么是注解? 从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加 素颜马尾好姑娘i/ 2022年09月02日 04:18/ 0 赞/ 195 阅读
相关 自定义注解 首先定义注解类: import java.lang.annotation.; @Documented @Target(ElementType.METHOD) @Ret 一时失言乱红尘/ 2022年07月20日 15:18/ 0 赞/ 244 阅读
相关 自定义注解 自定义注解 @Retention(RetentionPolicy.RUNTIME) // 元注解:注解的注解。此注解表示使注解保留到运行时。 @Target( ゝ一世哀愁。/ 2022年05月31日 12:24/ 0 赞/ 290 阅读
相关 自定义注解 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; 谁践踏了优雅/ 2022年03月30日 03:30/ 0 赞/ 292 阅读
相关 自定义注解 转载:[https://my.oschina.net/itblog/blog/1525665][https_my.oschina.net_itblog_blog_1525665 红太狼/ 2022年03月19日 08:51/ 0 赞/ 274 阅读
相关 自定义注解 注解是一种元数据形式,即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。注解用来修饰,类、方法、变量、参数、包。注解不会对所修饰的代码产生直接的 痛定思痛。/ 2021年12月21日 11:51/ 0 赞/ 326 阅读
相关 022.自定义注解 注解是Jdk1.5新增新技术。很多框架为了简化代码,都会提供有些注解。 可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。 注解不 缺乏、安全感/ 2021年10月06日 15:40/ 0 赞/ 197 阅读
还没有评论,来说两句吧...