系列文章目录
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自定义注解,如果有任何疑问欢迎私信或者评论