java必知必会-java自定义注解

系列文章目录

java必知必会-java环境搭建
java必知必会-java开发工具安装与使用
java必知必会-java关键字、变量和常量
java必知必会-java数据类型和变量定义
java必知必会-java类和对象
java必知必会-java面向对象的三大特性
java必知必会-java继承与重写、重载
java必知必会-java构造方法与访问修饰符
java必知必会-java抽象类与接口
java必知必会-java常见关键字及其作用
java必知必会-java常见关键字及其作用
java必知必会-java常用api



前言

本文介绍java中如何自定义注解


一、什么是注解?

  • 注解是java代码级别的说明,与类、接口、枚举同一层次
  • 作用
    • 编译检查 如@override
    • 代码分析 如mybatis取代xml文件的@Sql
    • 编写文档 如@doc
  • 优点:开发效率高,成本低
  • 缺点:耦合性大,不利于后期维护

二、jdk提供的注解

注解说明
@Override复写父类方法
@Deprecated标注方法过时(①安全问题②新的API取代)
@SuppressWarnings(value)压制(编译)警告
deprecation:忽略过时
rawtype:忽略类型安全
unused:忽略不使用
unchecked:忽略安全检查
null:忽略空指针
all:忽略所有

三、自定义注解

1. 元注解

  • 元注解用于确定被修饰的自定义注解的JDK提供的注解

  • @Retention用于确定被修饰的自定义注解声明周期

    • RetentionPolicy.SOURCE:注解在源码级别可见(提供给编译器使用)
    • RetentionPolicy.CLASS:注解在源码和字节码文件级别可见(提供给JVM使用)
    • RetentionPolicy.RUNTIME:注解在源码和字节码文件级别、内存可见(取代xml配置)
  • @Target(//代表注解修饰的范围:类上使用,方法上使用,字段上使用

    • ElementType.FIELD:字段上可用此注解
    • ElementType.METHOD:方法上可以用此注解
    • ElementType.TYPE:类/接口上可以使用此注解
    • ElementType.PARAMETER:允许作用在方法参数上
    • ElementType.CONSTRUCTOR:构造方法上面可以用
    • ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
    • ElementType.ANNOTATION_TYPE:允许作用在注解上
    • ElementType.PACKAGE:允许作用在包上
  • @Documented //使用javaDoc生成api文档时,包含此注解

  • @Inherited子类继承父类当前注解

2.定义注解

范式如下

[public] @interface 注解名{
	[[public abstract] 返回值类型(基本类型、String、枚举、注解、Class及其一维数组) 属性名()[default];](s)
}		

举例

public class Main {

    @MyAnnotation(name = "myName",fun = 1)
    private String myName;

    @MyAnnotation(name = "myfun",fun = 2)
    public void myfun(){
        System.out.println("myfun");
    }

    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
        Class<Main> mainClass = Main.class;
        Field myName = mainClass.getDeclaredField("myName");
        if(myName.isAnnotationPresent(MyAnnotation.class)){
            MyAnnotation myAnnotation = myName.getAnnotation(MyAnnotation.class);
            System.out.println(myAnnotation.fun());
            System.out.println(myAnnotation.name());
        }
        Method method = mainClass.getDeclaredMethod("myfun");
        if(method.isAnnotationPresent(MyAnnotation.class)){
            MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
            System.out.println(myAnnotation.fun());
            System.out.println(myAnnotation.name());
        }
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
@Documented
@Inherited
@interface MyAnnotation{
    int fun() default 1;
    String name() default "MyAnnotation";
}

总结

本文介绍了java自定义注解,如果有任何疑问欢迎私信或者评论

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值