一、概念解释
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());
}
}
}
运行结果:
我的名字就是类啊
我的名字就是方法啊
旁白:注解就是对类或者方法,属性什么的进行备注贴标签,在庞大的代码中能更快的寻找阅读代码,这些注解不会对实际代码产生什么影响,注解有自定义的,还有注解的注解,也就是元注解,还有可以对这些注解里面写入的内容进行解析读取出来。