注解的写法
@XXX[(一些信息)]
写在哪
类/属性/方法/构造方法上/参数的前面
注解的作用
用来当作注释的作用,如date类型中的那些过时的方法就是注解修饰导致的,如"@Deprecated"
做代码的检测,如方法重写实现时写在类上的,如"@Override"
携带一些信息
注解类的信息必须是基本数据类型/String类型信息/枚举类型/注解类型/数组类型,数组里只能是前四个的类型
java自带的注解
@Deprecated 说明方法时废弃的
@Override 做方法的检测是否被重写
@SuppressWarnings(“unused”) 变量定义后未被使用
@SuppressWarnings(“serial”) 实现implements Serializable接口时,告诉编译器不用检测了
@SuppressWarnings(“rawtypes”) 创建集合时没有泛型
自定义注解
通过@interface自定义注解类型
元注解(也是注解,不是用来使用的,而是用来说明注解)
@Targer 描述当前的这个注解可以放置在哪里
@Retention 描述当前这个注解存在什么作用域中
@Inherited 描述这个注解是否能被子类对象继承
@Document 描述这个注解是否能被文档所记录
注解的使用
先自定义一个注解类
//放在什么上面:属性/方法/构造方法
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
//作用域
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
//不常用
String name = "";
//注解要求方法必须有返回值,只能是上面的五个类型
String[] value()default "哈哈哈";
}
在类的属性/方法/构造方法添加注解
public class Atm {
@Anno(value = {"张三","李四","王五"})
private String nameString;
}
读取注解里的值
public static void main(String[] args) {
try {
//获得类
Class clazz = Class.forName("atm.Atm");
//获得属性
Field field = clazz.getDeclaredField("nameString");
//获得属性上的注解
Annotation annotation = field.getAnnotation(Anno.class);
//执行方法即可
// Anno anno= (Anno)annotation;
// String[] arr = anno.value();
// for (String string : arr) {
// System.out.println(string);
// }
Class class1 = annotation.getClass();
Method method = class1.getMethod("value");
String[] arr = (String[])method.invoke(annotation);
for (String string : arr) {
System.out.println(string);
}
} catch (Exception e) {
e.printStackTrace();
}
}