注解---

概念

说明程序的。给计算机看的

注解定义

注解(Annotation),也叫元数据是一种代码级别的说明。它是jdk1.5及以后版本引入的一个新特性。与接口,类,枚举

是在同一层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明

注解作用

1.编写文档:通过代码里标识的注解生成文档【生成文档doc文档】

步骤:创建对象,标注注解

然后打开DOS命令窗口,

javadoc 文件名.java

/**
 *注解javadoc演示
 *
 * @author itcast
 * @version 1.0
 * @since 1.5
 *
 * */
public class AnnoDom1 {
    /**
     * 计算两数的和
     * @param a 整数
     * @param b 整数
     * @return  两数的和
     * */
    public int add(int a,int b){
        return a+b;
    }
}

2.代码分析:通过代码里标识的注解对代码进行分析【使用反射】

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
​
}
@Pro(className = "cn.itcast.annotation4.Student",methodName = "show")
public class ReflectTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
​
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        Pro annotation = reflectTestClass.getAnnotation(Pro.class);
        String className = annotation.className();
        String methodName = annotation.methodName();
​
        Class<?> cls = Class.forName(className);
        Object obj = cls.newInstance();
        Method method = cls.getMethod(methodName);
        method.invoke(obj);
​
​
    }
​
}

3.编译检测:通过代码里标识的注解让编译器能够实现基本的编译检测

注解本质

/*注解本质就是一个接口,该接口默认继承Annotation接口*/
public interface MyAnno extends java.lang.annotation.Annotation{}
​

注解中可以定义属性

属性:就是抽象方法,定义了属性使用时需要给属性赋值

1.如果定义属性时,使用default关键字给属性默认初始化值则使用注解时可以不进行属性赋值

2.如果只有一个属性需要赋值,并且属性的名称是value,可以直接定义值就可以

3.数组赋值时,值用大括号包裹,如果数组中只有一个值,则大括号可以省略

JDK中预定义的注解

@Override:检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated:该注解标注的内容,表示已过时

@SuppressWarnings 压制警告

一般传递参数all @SuppressWarnings("all")

自定义注解

格式

元注解

public @interface 注解名称{

属性列表

1.基本数据类型

2.字符串

3.枚举

4.注解

5.value

6.以上类型数组数组

}

public @interface MyAnno {
  int age();
  String name() default "张三";
  Season season();
  MyAnno2 anno2();
  String[] str();
}
@MyAnno(age = 12,season = Season.SPRING,anno2=@MyAnno2,str = {"1"})
public class worker {
    
}

元注解:

用来描述注解的注解

@Target(ElementType.取值) 描述注解能够作用的位置

取值:

TYPE:可以作用于类上 METHOD:可以作用于方法上 FIELD:可以作用于成员变量上

@Retention(RetentionPolicy.RUNTIME)描述注解被保留的三个阶段

@Documented:描述注解是否被抽取到API文档中

@Inherited:描述注解是否被子类继承

public class AnnoDemo {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
       // 1.通过反射获取userTest类的字节码文件
        Class<?> clazz = Class.forName("cn.itcast.annotation2.UseTest");
        UseTest useTest = (UseTest) clazz.newInstance();
​
        //2.通过反射获取这个类里面所有的方法对象
        Method[] methods = clazz.getMethods();
​
        //遍历数组,得到每一个方法对象
        for (Method method : methods) {
            //method依次表示每一个方法对象
            //isAnnotationPresent(Class<? extends Annotation> annotation)
            //判断当前方法是否有指定的注解
            //参数:注解的字节码文件对象
            //返回值true存在,false不存在
            if (clazz.isAnnotationPresent(Test.class)){
                method.invoke(useTest);
            }
        }
​
    }
}

在程序使用(解析)注解

获取注解中定义的属性值

步骤

1.获取注解定义的位置的对象

2.获取指定的注解

getAnnotation(Class)获取注解对象

3.调用注解中的抽象方法获取配置的属性值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值