编程语言
首页 > 编程语言> > Java注解开发的使用

Java注解开发的使用

作者:互联网

目录

注解

定义:

​ 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性。与类、接口、枚举、是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

作用分类:

  1. 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
  2. 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
  3. 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

1. JDK预定义的注解

@Override

@Deprecated:注释的内容已过时

@SuppressWarnings:压制警告

2. 自定义注解

格式:

// 元注解
public @interface 注解名称 {
    // 属性列表
}

自定义注解反编译后的内容

public interface MyAnno extends java.lang.annotation.Annotation {
    
}

本质就是一个继承了Annotation接口的一个接口。既然是一个接口,我们就可以用接口的方式去开发,可以定义抽象方法等。

public @interface MyAnno {
    public String name = "Elian";
    public String show();
}

3. 属性

​ 在接口中定义的方法就是它的属性;

  1. 必须得有返回结果
  2. 返回的必须是以下类型:
    • 基本数据类型
    • String类型
    • 枚举类型
    • 注解
    • 及以上的数组类型
public @interface MyAnno {
    String name();
    String addr();
    int age() default 18; // 在使用注解的时候,没有给该属性赋值,那么就使用默认值
    PersonEnum person();
}

public @interface MyAnnoNew {
    String value();
    MyAnno anotherAnno();
    String[] names();
}

public enum PersonEnum {
    ZhangSan, LiSi
}

public class AnnoTest {

    @MyAnno(name = "Elian", addr = "北京通州", person = PersonEnum.LiSi)
    public void show() {

    }

    @MyAnnoNew(names = "Elian",value = "Elian", anotherAnno = @MyAnno(name = "Elian", addr = "北京通州", person = PersonEnum.ZhangSan))
    public void value() {

    }
}

属性值赋值的注意点:

  1. 如果定义属性时,使用default关键字给属性默认初始值,可以在使用注解时不赋值,如上age()
  2. 如果只有一个属性需要赋值,而且该属性的名称是value那么在赋值时,可以省略"value = "
  3. 数组赋值的时候,值使用{}包裹,如果数组中只有一个值,那么{}可以省略

4. 元注解

JDK中提供的4个元注解

  1. @Target:描述当前注解能够作用的位置
    • ElementType.TYPE:可以作用在类上
    • ElementType.METHOD:可以作用在方法上
    • ElementType.FIELD:可以作用在成员变量上
  2. @Retention:描述注解被保留到的阶段
    • SOURCE < CLASS < RUNTIME
    • SOURCE:表示当前注解只在代码阶段有效
    • CLASS:表示该注解会被保留到字节码阶段
    • RUNTIME:表示该注解会被保留到运行阶段JVM
    • 自定义的注解:RetentionPolicy.RUNTIME 常用,保留到运行时
  3. @Documented:描述注解是否被抽取到JavaDocAPI中
  4. @Inherited: 描述注解是否可以被子类继承
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnoSource {
}

5. 注解开发

demo

public class Student {
    public void show() {
        System.out.println("Student show......");
    }
}
class Teacher {
    public void show() {
        System.out.println("Teacher show......");
    }
}

@InvokAnno(className = "com.elian.annotation.Student", methodName = "show")
class MyMain {
    public static void main(String[] args) throws Exception {
        Class<MyMain> clazz = MyMain.class;
        InvokAnno annotation = clazz.getAnnotation(InvokAnno.class);

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

        Class<?> clazzTarget = Class.forName(className);
        Object object = clazzTarget.newInstance();
        Method method = clazzTarget.getDeclaredMethod(methodName);
        method.invoke(object);
    }
}

标签:Java,String,show,MyAnno,开发,注解,public,属性
来源: https://www.cnblogs.com/coderElian/p/15948401.html