注解
Salted Fish 1991/6/26 面试基础
# 注解的作用?
注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:
生成文档,通过代码里标识的元数据生成javadoc文档。
编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
# 注解的常见分类
Java自带的标准注解,包括
@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。元注解,元注解是用于定义注解的注解,包括
@Retention、@Target、@Inherited、@Documented@Retention用于标明注解被保留的阶段@Target用于标明注解使用的范围@Inherited用于标明注解可继承@Documented用于标明是否生成javadoc文档
自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。
# 自定义注解示例
import com.ctcc.nssap.config.BlankOrPatternValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Pattern;
import java.lang.annotation.*;
/**
* @description:自定义注解 验证器 当字段不为null且长度>0 才执行正则校验
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {BlankOrPatternValidator.class})
public @interface BlankOrPattern {
String regexp();
Pattern.Flag[] flags() default {};
String message() default "{javax.validation.constraints.Pattern.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
Pattern[] value();
}
public static enum Flag {
UNIX_LINES(1),
CASE_INSENSITIVE(2),
COMMENTS(4),
MULTILINE(8),
DOTALL(32),
UNICODE_CASE(64),
CANON_EQ(128);
private final int value;
private Flag(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import com.ctcc.nssap.annotation.BlankOrPattern;
import com.ctcc.nssap.exception.NssapServiceException;
import com.ctcc.nssap.util.JudgeNullUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.Pattern.Flag;
import java.util.regex.Matcher;
import java.util.regex.PatternSyntaxException;
/**
* @description:验证器 当字段不为null且长度>0 才执行正则校验
*/
public class BlankOrPatternValidator implements ConstraintValidator<BlankOrPattern, String> {
private static final Logger logger = LoggerFactory.getLogger(BlankOrPatternValidator.class);
private java.util.regex.Pattern pattern;
public BlankOrPatternValidator() {
}
@Override
public void initialize(BlankOrPattern parameters) {
Flag[] flags = parameters.flags();
int intFlag = 0;
Flag[] arr$ = flags;
int len$ = flags.length;
for (int i$ = 0; i$ < len$; ++i$) {
Flag flag = arr$[i$];
intFlag |= flag.getValue();
}
try {
this.pattern = java.util.regex.Pattern.compile(parameters.regexp(), intFlag);
} catch (PatternSyntaxException var8) {
throw new PatternSyntaxException("正则表达式模式中的语法错误");
}
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
//判断字符串是否为空
if (JudgeNullUtil.isNull(value)) {
return true;
} else {
Matcher m = this.pattern.matcher(value);
return m.matches();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54