概念:
注释——用文字描述程序的——给程序员看的,计算机执行时直接忽略注释;
注解——说明程序的——给计算机看的,JDK1.5之后提供的新特性;
1.编写文档:通过代码里标识的元数据生成文档【生成文档文档】——API文档;
2.代码分析:通过代码里标识的元数据对代码进行分析【使用反射】——重点使用的功能;
3.编译检查:通过代码里标识的元数据让能够实现基本的编译检查——@Override
JDK内置注解:
@Override:
检查被该注解标注的方法是否为继承自父类(接口)的,即是否为父类(接口)重写的方法;
系统会自动检查,若编写的方法与父类构造不同,就会报错提醒;
@Deprecated:
该注解标注的内容已过时,一个建议注解;
当有新方法优化了旧方法,但是为了此程序兼容低版本,不能删除旧方法,则可使用该注解标注旧方法表示已过时;
@SuppressWarnings():
压制警告
形式:@SuppressWarnings("all")——一般传递参数all
放在类上面,将消除该类的所有警告;放在某个方法上面,仅消除该方法的所有警告
自定义注解:
格式:
元注解
public @interface 自定义注解名{
类型 属性1();
类型 属性2() default "默认值";
}
本质:
//本质就是一个接口——默认继承Annotation接口:
public interface 自定义注解名 extends java.lang.annotation.Annotation{}
属性定义:
注解的属性:接口中可以定义的抽象方法;
解释:
在自定义注解中定义的方法,使用时类似于属性,因此在注解中的方法称为属性;
在定义属性时尽可能命名像传统意义的属性名一样;
定义要求:
1.属性的返回值类型:基本数据类型、String、枚举、注解、前面类型的数组;
ps:不能使用void方法、自定义类型!!!
2.定义之后,在使用时,要给其赋值;
自定义注解(属性1= 值,属性2= 值)
//定义属性时设置default值,则使用时可不赋值;
//若只有属性需要赋值,并属性名为value,则value可省略;
//数组赋值时,只使用{};若数组中只有一个值{}可省略;
元注解:
JDK中已定义的注解——用于描述注解的注解;
@Target:被描述的注解作用的位置;
value={ElementType.值})
(/*
可取的值:
TYPE:作用在类上
METHOD:作用在方法上
FIELD:作用在成员变量上
*/
@Retention:被描述的注解被保留的阶段;
value={RetentionPolicy.值})
(/*
可取的值:
SOURCE:当前被描述的注解,不会被编译
CLASS:当前被描述的注解,会保留到class字节码文件中——会被编译
RUNTIME:当前被描述的注解,会保留到class字节码文件中,被JVM会读取——自定义注解常用的值
*/
@Documented:被描述的注解是否被抽取到API文档中;
@Inherited:被描述的注解是否被子类继承;
ps:一个类上使用了注解,该注解定义时也有@Inherited,则该类的子类会自动继承该注解;
解析注解:
在程序中使用(解析)注解——获取注解中定义的属性值;
使用场景:
注解大多数使用情况都是用来替换配置文件的,简化书写;
步骤:
1.获取注解定义的位置的对象(Class、Method、Field)
2.获取指定的注解:注解名 变量名 = getAnnotation(注解名.class)
3.调用注解中的抽象方法获取属性值:变量名.抽象方法()
/**
* @author SepLibraH
* @data 2024/8/14
* 通过自定义注解实现反射,调用其他类和其方法——用来替换配置文件
**/
className = "java_base.java_pro",methodName = "show")
(public class reflect {
public static void main(String[] args) throws Exception{
//获取该类的字节码文件对象
Class<reflect> reflectClass = reflect.class;
//获取上面Pro的注解对象
//在内存中继承了自定义的Pro注解,并重写了其中的属性,属性值为调用Pro时传入的参数;
Pro an = reflectClass.getAnnotation(Pro.class);
// 调用重写的Pro中属性,获取返回值
String className = an.className();
String methodName = an.methodName();
//打印测试
System.out.println(className+"和"+methodName);
}
}
案例:
简单的测试框架:
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:http://seplibrah.cn/java%e9%ab%98%e7%ba%a7%e7%af%87-%e6%b3%a8%e8%a7%a3/