作为Java后端开发人员,每天都要看或写很多的@
比如 @Autowired等
“@”在Java中称为注解
注解:也叫元数据。一种代码级别的说明。他是JDK1.5及以后版本引入的一个特性,与类接口,枚举是在同一个层次。它可以声明在包,类,字段,方法,局部变量,方法参数等前面,用来对这些元素进行解释,说明。
如果第一次接触注解的你相信你现在一脸懵逼
个人理解:
注解就是标签。为包,类,方法,属性,等打的一个标签。
也可以把它理解为注释,只不过这个注释是给计算机看的不是给程序员看的。
为什么注解也叫元数据呢?
元数据:即描述数据的数据。
那么注解也即:描述程序的程序。
作用:
1,编写文档
2,编译检查
编写一个JavaDoc类
/**
* @version 1.0
* @Author:杨杰
* @Date:2022/5/15 16:21
*/
public class JavaDoc {
/**
* 加法
* @param a
* @param b
* @return 返回结果
*/
public int add(int a,int b) {
return a + b;
}
}
命令行打开当前目录
运行成功
双击index.html
这就是编写文档
什么又是编译检查呢?
举一个例子
我们经常重写ToString方法
@Override
public String toString() {
return "Student{" +
"id='" + userId + '\'' +
", username='" + username + '\'' +
", ustatus='" + ustatus + '\'' +
", money=" + money +
'}';
}
@Override注解就是标注该方法重写了父类的方法
如果不加获取写错Override那么就会报错,编译检查不通过
自定义注解
格式
public @interface 注解名称 {}
例如
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoReflect {
String className();
String methodName();
}
元注解
描述注解的注解
@Target:描述能够作用的位置
@Target(ElementType.TYPE)
ElementType取值
1,TYPE:可以作用在类上
2,METHOD:可以作用在方法上
3,FIELD:可以作用在成员变量上
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会被保留到字节码文件中,并被JVM读取到,一般直接定义的注解都加在RUNTIME
@Documented:描述该注解是否会被抽取到api文档中
@Inherited:描述注解是否被子类继承
来一个小案例
自定义AnnoReflect注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoReflect {
String className();
String methodName();
}
创建 AnnoTest1类
public class AnnoTest1 {
public void play(){
System.out.println("AnnoTest1 method play()");
}
测试类
@AnnoReflect(className = "cn.itcast.annotion.AnnoTest1",methodName = "play")
public class ReflectAnnotationTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
/**
* 前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法
* 即:拒绝硬编码
*/
//1. 解析注解
//1.1 获取该类的字节码文件对象
Class<ReflectAnnotationTest> rac = ReflectAnnotationTest.class;
//1.2 获取上面的注解对象,其实就是在内存中生成了一个该注解接口的子类实现对象
AnnoReflect an = rac.getAnnotation(AnnoReflect.class);
/*
相当于 public class AnnotationReflect implements AnnoReflect{
public String className(){
return "cn.other.annotation.AnnoTest1";
}
public String methodName(){
return "play";
}
}
*/
//2. 调用注解对象中定义的抽象方法,获取返回值
String className = an.className();
String methodName = an.methodName();
//3.加载该类进内存
Class cls = Class.forName(className);
//4.创建对象
Object obj = cls.newInstance();
//5.获取方法对象
Method method = cls.getMethod(methodName);
//6.执行方法
method.invoke(obj);
}
}
注意:注解的本质为接口
参考 参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/133785.html