如果 注解属性 名称是 value , 并且 注解中只有 1 1 1 个属性 , 那么在使用 注解 为 注解属性 赋值时 , 可以省略注解名称 , 直接传入 注解属性值 ;
示例 : JDK 自带的 SuppressWarnings 注解 ,
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicySOURCE)
public @interface SuppressWarnings {
String[] value();
}
登录后复制
注解使用 : 使用 SuppressWarnings 注解时 , 直接传入 “all” 参数 , 省略了注解属性名称 ;
@SuppressWarnings("all")
@Override
public String toString() {
return supertoString();
}
登录后复制
满足两个条件 , 才能使用上述简化方式 ;
Java注解(Annotation)就是一种java标注,并且能够携带数据, 是在JDK50被引入的。
Java的注解可以标注Java语言中的类、变量、方法、参数、包等等。
值得注意的是: 上面所说的Java注解只是一种标注,所以注解需要配合反射来使用才能发挥出强大作用。
注解的成员变量只支持 八种基本数据类型(byte、short、int、long、float、double、char、boolean)、String、Class、Enum、Annotation 。
还有的就是,所有的注解都是Annotation接口的实现类,可以把Annotation接口看成是所有注解的超类 。
上面就是定义了一个可以标注在类或者注解以及方法上的,保留到运行期的注解。 但是也仅仅是定义了一个注解而已,一个注解要发挥它自己的作用,还需要反射的配合。
反射是java中的一种机制,通过这种机制我们能够在运行时获取到一个类的一切信息(继承的类、实现的接口、属性、方法等), 以及注解信息和注解所携带的数据 。
通过获取到的类信息,我们可以构造一个新的对象、获取到某个对象的属性值、执行某个对象的方法等。
定义value注解
定义pojo User类
测试并使用注解
目标人群 :Java开发者
本文目标 :通过AOP注解占位符,匹配目标方法参数,可用于日志记录等场景
阅读时间 :2 分钟
重点关注: annotationResolver()方法为核心注解解析方法
通过注解中的“ ${d} ”占位符,匹配方法参数列表,实现动态参数的注入。
执行结果:
注解的使用一般是与java的反射一起使用,下面是一个例子
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
自定义注解及其应用
1)、定义一个最简单的注解
public @interface MyAnnotation {
//
}
2)、把注解加在某个类上:
@MyAnnotation
public class AnnotationTest{
//
}
以下为模拟案例
自定义注解@MyAnnotation
1 package comljqtest;
2
3 import javalangannotationElementType;
4 import javalangannotationRetention;
5 import javalangannotationRetentionPolicy;
6 import javalangannotationTarget;
7
8 /
9 定义一个注解
10
11
12 @author jiqinlin
13
14 /
15 //Java中提供了四种元注解,专门负责注解其他的注解,分别如下
16
17 //@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
18 //RetentionPolicySOURCE: 停留在java源文件,编译器被丢掉
19 //RetentionPolicyCLASS:停留在class文件中,但会被VM丢弃(默认)
20 //RetentionPolicyRUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
21
22 //@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
23 //ElementTypeCONSTRUCTOR: 构造器声明
24 //ElementTypeFIELD: 成员变量、对象、属性(包括enum实例)
25 //ElementTypeLOCAL_VARIABLE: 局部变量声明
26 //ElementTypeMETHOD: 方法声明
27 //ElementTypePACKAGE: 包声明
28 //ElementTypePARAMETER: 参数声明
29 //ElementTypeTYPE: 类、接口(包括注解类型)或enum声明
30
31 //@Documented将注解包含在JavaDoc中
32
33 //@Inheried允许子类继承父类中的注解
34
35
36 @Retention(RetentionPolicyRUNTIME)
37 @Target({ElementTypeMETHOD, ElementTypeTYPE})
38 public @interface MyAnnotation {
39 //为注解添加属性
40 String color();
41 String value() default "我是林计钦"; //为属性提供默认值
42 int[] array() default {1, 2, 3};
43 Gender gender() default GenderMAN; //添加一个枚举
44 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期为1988-2-18");
45 //添加枚举属性
46
47 }
注解测试类AnnotationTest
1 package comljqtest;
2
3 /
4 注解测试类
5
6
7 @author jiqinlin
8
9 /
10 //调用注解并赋值
11 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期为1988-2-18"),color="red", array={23, 26})
12 public class AnnotationTest {
13
14 public static void main(String[] args) {
15 //检查类AnnotationTest是否含有@MyAnnotation注解
16 if(AnnotationTestclassisAnnotationPresent(MyAnnotationclass)){
17 //若存在就获取注解
18 MyAnnotation annotation=(MyAnnotation)AnnotationTestclassgetAnnotation(MyAnnotationclass);
19 Systemoutprintln(annotation);
20 //获取注解属性
21 Systemoutprintln(annotationcolor());
22 Systemoutprintln(annotationvalue());
23 //数组
24 int[] arrs=annotationarray();
25 for(int arr:arrs){
26 Systemoutprintln(arr);
27 }
28 //枚举
29 Gender gender=annotationgender();
30 Systemoutprintln("性别为:"+gender);
31 //获取注解属性
32 MetaAnnotation meta=annotationmetaAnnotation();
33 Systemoutprintln(metabirthday());
34 }
35 }
36 }
枚举类Gender,模拟注解中添加枚举属性
1 package comljqtest;
2 /
3 枚举,模拟注解中添加枚举属性
4
5 @author jiqinlin
6
7 /
8 public enum Gender {
9 MAN{
10 public String getName(){return "男";}
11 },
12 WOMEN{
13 public String getName(){return "女";}
14 }; //记得有“;”
15 public abstract String getName();
16 }
注解类MetaAnnotation,模拟注解中添加注解属性
1 package comljqtest;
2
3 /
4 定义一个注解,模拟注解中添加注解属性
5
6 @author jiqinlin
7
8 /
9 public @interface MetaAnnotation {
10 String birthday();
11 }
以上就是关于java注解的参数没有被赋值全部的内容,包括:java注解的参数没有被赋值、通过注解和反射实现一个简单的@Value注解、AOP 注解动态注入参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)