注解Annotation

tech2024-08-12  45

注解的写法

@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(); } }
最新回复(0)