一、概念解释
1.什么是注解?
标准解释:java中的类、构造器、方法、成员变量、参数都可以被注解进行贴上标签。
直白理解:注解也可以理解为标签。对一个人的评价高矮胖瘦,好人坏人或者渣男老实人等,就是起到你给它贴上这个标签,但是这些标签又不会对他本人产生什么影响。因为那个标签只是你的看法
2.注解有什么作用?
答:就是为了方便对类中的信息进行标注注释,方便查看。不会对实际代码产生什么影响。
3.注解的分类?
(1)自定义注解
答:自己可以任意DIY定义的注解:比如给其他人打上你想打的任意标签信息
(2)元注解
答:注解的注解(就是标签上面再贴标签):对自定义的标签设置可以在哪里使用和能存活多久
常用的有两个:
@Target:约束自定义注解只能在哪些地方使用
//括号里面加入以下哪个,哪种类型就可以允许贴上这个标签
类、接口----TYPE
成员变量----FIELD
成员方法----METHOD
方法参数----PARAMETER
构造器----CONSTRUCTOR
局部变量----LOCAL_VARIABLE
@Retention:申明注解的生命周期
只在源码阶段(用的比较少)-----SOURCE
源码、字节码阶段(默认)---CLASS
源码、字节码、运行阶段(开发常用)--RUNTIME
(3)注解解析
答:对已经被这个注解过的地方进行提取自定义的注解信息
提取被该注解的类就创建该类的信息,然后按照步骤提取。
提取被该注解的方法就创建该类的信息,然后按照步骤提取。
提取被该注解的属性就创建该类的信息,然后按照步骤提取。
二、实战案例分析
1.自定义注解
创建格式:
public @interface 注解名称 {
属性类型 属性名()defalt 默认值;
}
创建步骤:
1.创建一个类(类名就是注解名称),把类中的class改为@interface。然后定义要贴上的标签数据
//注解 package learn2; public @interface BadBoy { String name() default "坏男孩";//自定义标签值 这个default "坏男孩";----不写也可以,那就没有默认值了 int age();//自定义标签值 String value();//特殊标签值。(标签里面写上这个,被打上这个标签的属性,必须要有具体赋值。就像试吃食品,吃一个没事,吃多了就必须要给钱--赋值) }
2.给需要的地方打上注解标签
//被测试的类 package learn2; @BadBoy(name="汉奸",age = 45,value = "自定义")//在类上面建立就是类的注释 public class People { @BadBoy(name = "方法",age = 15,value = "自定义") //在方法上面建立就是方法的注释 public static void main(String[] args) { @BadBoy(name = "成员属性",age = 19,value = "自定义")//在属性上面建立就是属性的注释 String hobby="打篮球"; @BadBoy(age = 19,value ="自定义")//在属性上面建立就是属性的注释 String hobby1="跳舞"; } }
2.元注解
创建步骤:
1.在注解的上面创建@Target和@Retention这两个常用的元注解,里面的参数根据不同需要填入,参数不懂的滑到上面概念解析那里看。
//被测试的元注解 package learn2; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //里面参数不懂的返回上面看概念解析 //元注解--表示可以在哪里贴上 @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE}) //元注解---表示一直在运行阶段 @Retention(RetentionPolicy.RUNTIME) //自定义注解 public @interface BadBoy { String name() default "坏男孩"; }
2.元注解限制了自定义标签给谁用和生命周期等
//正常使用到的类 package learn2; @BadBoy(name="汉奸") public class People { @BadBoy(name = "方法") public static void main(String[] args) { @BadBoy(name = "爱好") String hobby="打篮球"; } }
3.注解解析
解析类
创建步骤:
1.创建要解析的类对象
2.if用isAnnotationPresent判断这个类是否有注解,(注解.class)
3.用getDeclaredAnnotation方法直接获取,(注解.class)
4.打印需要该解析类里面的某个自定义属性
解析方法
创建步骤:
1.创建要解析的类对象
2.用getDeclaredMethod获取方法("要获取的方法名")
3.if用isAnnotationPresent判断这个类是否有注解,(注解.class)
4.用getDeclaredAnnotation方法直接获取,(注解.class)
5.打印需要该解析类里面的某个自定义属性
package learn2; import java.lang.reflect.Method; @BadBoy(name="我的名字就是类啊") public class People { @BadBoy(name = "我的名字就是方法啊") public static void main(String[] args) throws NoSuchMethodException { //注解的解析 //一、解析类步骤 //1.解析这个类的对象 Class p = People.class; //2.判断这个类是否有这个注解 if (p.isAnnotationPresent(BadBoy.class)){ //3.直接获取该注释对象 BadBoy b = (BadBoy) p.getDeclaredAnnotation(BadBoy.class);//这里不用到万能键补全键,要手动进行强转 //5.打印需要的值 System.out.println(b.name()); } //二、解析方法步骤 //1.解析这个类的对象 Class p2 = People.class; //2.获取要获取的方法 Method m = p2.getDeclaredMethod("main", String[].class); //3.判断这个类是否有这个注解 if (m.isAnnotationPresent(BadBoy.class)){ //4.直接获取该注释对象 BadBoy b2 = (BadBoy) m.getDeclaredAnnotation(BadBoy.class);//这里不用到万能键补全键,要手动进行强转 //5.打印需要的值 System.out.println(b2.name()); } } }
运行结果:
我的名字就是类啊
我的名字就是方法啊
旁白:注解就是对类或者方法,属性什么的进行备注贴标签,在庞大的代码中能更快的寻找阅读代码,这些注解不会对实际代码产生什么影响,注解有自定义的,还有注解的注解,也就是元注解,还有可以对这些注解里面写入的内容进行解析读取出来。