Annotation 注解
package com.changyonglei.meijulei_zhujie.Annotation; import org.junit.Test; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Date; /** *注解的使用 * * *1.理解Annotation : * (1)jdk 5.0新增的功能 * (2)Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取, * 并且执行相对的处理。程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。 * (3)在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中 * 注解占据了更重要的角色,例如用来配置应用程序的任何切面, * 代替JavaEE旧版中所遗留的繁冗代码和XML配置等。 * *2.Annotation的使用示例 * 示例一: 生成文档相关的注解 * * 示例二: 在编译时进行格式检查(JDK内置的三个基本注解) * @Override: 限定重写父类方法,该注解只能用于方法 * @Deprecated: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择 * @SuppressWarnings: 抑制编译器警告 * * 示例三:跟踪代码依赖性,实现替代配置文件功能 * * *3.如何自定义注解:参照@SuppressWarnings去定义 * (1).注解声明为:@interface。 * (2).内部定义成员,通常使用value表示。 * (3).可以指定成员的默认值,使用default定义。 * (4).如果自定义注解没有成员,表明是一个标识作用。 * * 如果注解有成员,在使用注解时,需要指名成员的值。 * 自定义注解必须配上注解的信息处理流程(使用反射)才有意义。 * 自定义注解通过都会指明两个元注解: Retention. Target * * * 4. jdk提供的4种元注解 * 元注解:对现有的注解进行解释说明的注解 * (1)Retention:指定所修饰的 Annotation 的生命周期: SOURCE \CLASS(默认行为)\RUNTIME * 只有声明为RUNTIME生命周期的注解,才能通过反射获取。 * (2)Target:用于指定被修饰的Annotation能用于修饰哪些程序元素。 *****************以下出现频率比较低**************************** * (3)Documented:表示所修饰的注解在被javadoc解析时,保留下来。 * (4)Inherited:被它修饰的Annotation将具有继承性。 * * * 5.通过反射获取注解信息----到反射内容时在系统性讲解。 * * * 6.jdk 8中注解的新特性:可重复注解、类型注解: * 6.1可重复注解: * (1).在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class * (2).MyAnnotation的Target、@Inherited和Retention等元注解与MyAnnotations相同。 * 6.2类型注解: * ElementType.TYPE_PARAIMETER表示该注解能写在类型变量的声明语句中(如:泛型声明)。 * ElementType.TYPE_USE表示该注解能写在使用类型的任何语句中。 * * * @author Dixon * @create 2022-06-04 12:09 */ public class AnnotationTest { public static void main(String[] args) { //Date类就@Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择 Date date = new Date(2018, 5, 19); System.out.println(date); //@SuppressWarnings: 抑制编译器警告 没sout之前是灰色的,sout后白色了。加上注解后不变成灰色 @SuppressWarnings("unused") int num =10; // System.out.println(num); @SuppressWarnings({"unused","rawtypes"}) ArrayList list =new ArrayList(); } //Inherited 继承性的举例子 @Test public void testGetAnnotation(){ Class clazz = Student.class; Annotation[] annotations =clazz.getAnnotations(); for (int i = 0; i < annotations.length; i++) { System.out.println(annotations[i]);//@com.changyonglei.meijulei_zhujie.Annotation.MyAnnotation(value=hahaha) } } } //@MyAnnotations({@MyAnnotation(value = "hello"), @MyAnnotation(value = "love")}) //jdk8之前的老写法 //可重复注解 @MyAnnotation(value = "hello") @MyAnnotation(value = "love") class Person{ private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public void walk(){ System.out.println("人走路"); } public void eat(){ System.out.println("人吃饭"); } } interface Info{ public abstract void show(); } class Student extends Person implements Info{ //@Override: 限定重写父类方法,该注解只能用于方法 @Override public void walk() { System.out.println("学生走路"); } //@Override: 限定重写父类方法,该注解只能用于方法 @Override public void show() { System.out.println("展示学生"); } } class Generic<@MyAnnotation T>{ public void show()throws @MyAnnotation RuntimeException{ ArrayList<@MyAnnotation String> list = new ArrayList<>(); int num =(@MyAnnotation int)10L; } }
package com.changyonglei.meijulei_zhujie.Annotation; import java.lang.annotation.*; /** * @author Dixon * @create 2022-06-04 15:33 */ @Repeatable(MyAnnotations.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE }) @Inherited public @interface MyAnnotation { String value() default "hahaha"; }
package com.changyonglei.meijulei_zhujie.Annotation; import java.lang.annotation.*; /** * @author Dixon * @create 2022-06-04 16:25 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE}) @Inherited public @interface MyAnnotations { MyAnnotation[] value(); }
posted on 2022-06-04 20:30 Dixon_Liang 阅读(26) 评论(0) 编辑 收藏 举报