Java自带注解、元注解、自定义注解的区别
作者:laluckystar
什么是注解
1.Annotation是从JDK5.0开始引入的新技术
2.Annotation的作用 :
(1)不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
(2)可以被其他程序(比如:编译器等)读取
3.Annotation的格式:
注解是以"@注释名"在代码中存在的,还可以添加一-些参数值,例如:@SuppressWarnings(value="unchecked")
4.Annotation在哪里使用?
可以附加在package , class , method , field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
在java中,注解分为三种类型:自带注解、元注解、自定义注解。
自带注解
java自带注解只有三个:@Override、@Deprecated、@SuppressWarnings
1.@Override :定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明
2.@Deprecated :定义在java.lang.Deprecated中, 此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素, 通常是因为它很危险或者存在更好的选择
3.@SuppressWarnings :定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息
与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了
(1)@SuppressWarngs("all")
(2)@SuppressWarnings("unchecked")
(3)@SuppressWarnings(value={"unchecked","deprecation"})等等
元注解
元注解是注解的注解,常标注于自定义注解之前,用来对注解的一个简单描述。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override{ }
元注解一共有四个:@Target、@Retention、@Inherited、@Documented
- @Target是自定义注释时必选的,表示该注解的作用目标。
- @Retention注解也是必选的,表示该注解的保留策略。
- @Inherited和@Documented是可选的元注解。
自定义注解
声明语法:
@Target(ElementType...) @Retention(RetentionPolicy...) 权限修饰符 @interface 注解名称(){ //注解体,可以定义属性 属性类型 属性名() default 默认值; }
属性声明格式:属性类型 属性名() default 默认值;
属性类型:基本数据类型(byte、short、int、long、float、double、boolean、char)、Class、String、enum、Annotation、以及上述类型的数组形式。
属性名():根据个人需求声明属性名。当属性只有一个的时候,一般属性名都写成value()。
//Spring框架注解之Component @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Component{ String value() default ""; }
在实际应用中,注解大多与反射结合使用。一般情况下,注解的使用是不影响代码的正常执行,它只是对代码做了一个简单的描述。但是通过注解+反射,就能够在编译时或者是运行时对代码的执行产生影响。
注解只提供对代码的描述,不影响代码的正常执行。影响代码执行的是通过反射获取注解中的属性
如何利用反射获取注解内容
利用反射获取注解内容步骤:
1.先利用反射获取Class对象
2.使用Class.getAnnotations()获取类上的所有注解内容(如果只想获取注解的值,可以使用Class.getAnnotation(XXX.class)获取特定的注解,然后在获取的注解内容使用.value()即可以获取注解的value值)
3.使用Class.getDeclaredField(“XX”)获取Class对象的特定内容的field对象,然后使用field.getAnnotation(XXX.class),获取到注解的内容
@Tablemi("mi") class Student2 { @Fieldmi(name = "id", type = "int", length = 10) private int id; @Fieldmi(name = "age", type = "int", length = 3) private int age; @Fieldmi(name = "name", type = "varchar", length = 5) private String name; public Student2() { } public Student2(int id, int age, String name) { this.id = id; this.age = age; this.name = name; } }//并提供get和set方法 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface Tablemi{ String value(); } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface Fieldmi{ String name(); String type(); int length(); }
测试代码:
Class c1 = Class.forName("com.mi.demo01.Student2"); //通过反射获取注解 Annotation[] annotations = c1.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } //获的注解的value值 Tablemi tablemi = (Tablemi)c1.getAnnotation(Tablemi.class); String value = tablemi.value(); System.out.println(value); //获得类指定的注解 Field field = c1.getDeclaredField("id"); Fieldmi fieldmi = field.getAnnotation(Fieldmi.class); System.out.println(fieldmi.name()); System.out.println(fieldmi.type()); System.out.println(fieldmi.length()); //获得类指定的注解 Field field1 = c1.getDeclaredField("name"); Fieldmi fieldmi1 = field1.getAnnotation(Fieldmi.class); System.out.println(fieldmi1.name()); System.out.println(fieldmi1.type()); System.out.println(fieldmi1.length()); //获得类指定的注解 Field field2 = c1.getDeclaredField("age"); Fieldmi fieldmi2 = field2.getAnnotation(Fieldmi.class); System.out.println(fieldmi2.name()); System.out.println(fieldmi2.type()); System.out.println(fieldmi2.length());
测试结果:
到此这篇关于Java自带注解、元注解、自定义注解的区别的文章就介绍到这了,更多相关Java自带注解 元注解 自定义注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!