Java注解

1.注解

  • 注释:说明程序的,用文字描述程序。给程序员看的。
  • 注解:Annotation,也叫元数据。
    • 代码级别的说明。
    • JDK1.5之后的新特性。
    • 与类、接口、枚举在一个层次。
    • 使用注解:@注解名称
  • 作用
    • 编写文档:生成doc文档
      • 示例:给hello.java生成文档
        • 打开cmd.exe
        • 来到当前路径下
        • 输入:javadoc hello.java
        • 打开生成的index.html
    • 代码分析::使用反射
    • 编译检查:override

2.Java预定义注解

  • @Override:检测被该注解标注的方法是否是继承子父类(接口)
  • @Deprecated:表示被标注的内容已过时,不推荐,但是仍然可用
  • @SuppressWarnings:压制警告
    • 压制类中所有的警告
    • @SuppressWarnings("all")
      class Demo{
      }

       

3.自定义注解

  • 格式
    • 元注解
      • public @interface MyAnno{属性;}
  • 本质
    • 反编译:public interface MyAnno extends java.lang.annotation.Annotation{}
    • 注解本质上就是一个接口
    • 该接口继承了Annotation接口
  • 属性:接口中的抽象方法
    • 要求
      • 属性的返回值类型
        • 基本数据类型
        • String
        • 枚举
        • 注解
        • 以上类型的数组
      • 定义了属性,在使用时需要给属性赋值
        • 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不尽兴属性的赋值
        • 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
        • 数组赋值时,值使用{}包裹。如果数组中只有一个元素,则{}可以省略
public @interface MyAnno {
    int age();
    String show2() default "张三";
}

@MyAnno(age = 12)
public class AnnoDemo1 {

}
  • 元注解:用于描述注解的注解
    • @Target:描述注解能够作用的位置
      • ElementType取值
        • TYPE:可以作用于类上
        • METHOD:可以作用于方法上
        • FIELD:可以作用于此成员变量上
    • @Retention:描述注解被保留的阶段
      • RetentionPolicy取值
        • RUNTIME:当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
    • @Documented:描述注解是否被抽取到api文档中
    • @Inherited:描述注解是否被子类继承
import java.lang.annotation.*;

@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnno {
    int age();
    String show2() default "张三";
    @Override
}

4.使用注解

  • 获取注解中定义的属性值
  • 注解大多数用来替换配置文件(反射)
  • 注解给谁用?
    • 编译器
    • 解析程序
  • 注解不是程序的一部分
/**
 * 描述需要执行的类名和方法名
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
}

@Pro(className = "Person",methodName = "show")
public class ReflectTest {
    public static void main(String[] args) {
        /**
         * 前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
         */

        // 1.解析注解
        //   获取该类的字节码文件对象
        Class<ReflectTest> reflectTestClass = ReflectTest.class;

        // 2.获取上边的注解对象
        //   其实就是在内存中生成了一个该注解接口的子类实现对象
        Pro an = reflectTestClass.getAnnotation(Pro.class);

        // 3.调用注解对象中定义的抽象方法,获取返回值
        String className = an.className();
        String methodName = an.methodName();
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值