java注解(菜鸟操作手册)

注解概述

java 注解(Annotation)又称 Java 标注,用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。
总结:
1 jdk1.5以后的新特性
2. 说明程序的
3. 使用注解 @注解名称

2注解的格式和本质

格式:
元注解 :
public @interface 注解名称{ }
本质:
注解本质上是一个借口,该接口默认继承Annotation{}

元注解:

用于描述注解的注解。

@Target 描述注解的作用范围
ElementType:

  1. TYPE 类上面 :Class, interface (including annotation type), or enum declaration
  2. FIELD 字段声明(包括枚举常量), Field declaration (includes enum constants)
  3. METHOD 方法 , Method declaration
  4. PARAMETER 参数 Formal parameter declaration
  5. CONSTRUCTOR 构造函数 , Constructor declaration
  6. LOCAL_VARIABLE 局部变量 Local variable declaration
  7. ANNOTATION_TYPE 注释类型 Annotation type declaration
  8. PACKAGE 包声明 Package declaration
  9. TYPE_PARAMETER 类型参数 Type parameter declaration 从jdk1.8开始
  10. TYPE_USE 类型使用 Use of a type 从jdk1.8开始

@Retention 描述注解被保留的阶段 (java 代码在计算机中的三个阶段 源代码阶段 - 类对象阶段 - 运行阶段)

@Documented 描述是否被抽取到api文档中

@Inherited 描述 是否被子类继承

3自定义注解属性定义

属性的返回值类型:
1.基本数据类型
2. 枚举
3. String
4. 注解
5. 以上类型的数组

例如:
/**

  • 自定义注解
    */
    public @interface Myann {

int age() default 19;

int show();

String show2();

Person per();

String[] strs();

}

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

2 如果只有一个属性赋值,并且属性的名字是value,则value可以省略,直接定义值

3数组赋值时候,使用{}包裹,如果数组只有一个值,则{}可以省略。

解析注解

程序中使用注解获取注解中的属性值:

 1   获取该类的字节码文件对象(反射获取字节码class对象,前面反射已经说过,分为3种方法)
            
               Class<ReflectTest> reflectTestClass = ReflectTest.class;
               
 2  获取注解定义的位置的对象(class,method,Field)    
 
 3 获取指定的注解
  Pro annotation = reflectTestClass.getAnnotation(Pro.class); 

4 调用注解对象中的抽象方法,获取返回值

String className = annotation.className();
String methodname = annotation.methodname();

例如:

/**

  • 描述需要执行的类型和方法名
    */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Pro {

    String className();
    String methodname();

}

public class Demo02 {

public  void  show(){
    System.out.println("Demo2方法");
}

}

@Pro(className = “AnnotationDay02.Demo02”, methodname = “show”)
public class ReflectTest {

public static void main(String[] args) throws Exception {

    //解析注解
    //1 获取该类的字节码文件对象
    Class<ReflectTest> reflectTestClass = ReflectTest.class;
    // 2 获取上面的注解类型
    Pro annotation = reflectTestClass.getAnnotation(Pro.class); //其实就是在内存中生成一个给注解接口的子类实现对象

    // 3 调用注解对象中的抽象方法,获取返回值

    String className = annotation.className();
    String methodname = annotation.methodname();

    //加载该类进内存
    Class cls = Class.forName(className);
   // 创建对象
    Object o = cls.newInstance();

    //获取方法对象
    Method method = cls.getMethod(methodname);
  //z执行方法
    method.invoke(o);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值