网站首页 > java教程 正文
什么是注解?
注解是一种能被添加到java源代码中的元数据,方法、类参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数、和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
申明注解要用到的东西
- 修饰符:访问修饰符必须为public,不写默认为public
- 关键字:@interface
- 注解名称:自定义注解名称,使用的时候会用到
- 注解类型元素:是注解中的内容,可以理解成自定义接口的实现部分
public @interface MyTarget {
String name() default "jack";
boolean flag();
}
JDK中有一些元注解,主要包括@Target、@Retention、@Document、@Inherited用来修饰注解。
@Target
表明该注解可以应用的java元素类型。注解的作用范围,就是注解用在什么地方的
Target类型 | 描述 |
ElementType.TYPE | 应用于类、接口(包括注解类型)、枚举 |
ElementType.FIELD | 应用于属性(包括枚举中的常量) |
ElementType.METHOD | 应用于方法 |
ElementType.PARAMETER | 应用于方法地形参 |
ElementType.CONSTRUCTOR | 应用于构造函数 |
ElementType.LOCAL_VARIABLE | 应用于局部变量 |
ElementType.ANNOTATION_TYPE | 应用于注解类型 |
ElementType.PACKAGE | 应用于包 |
ElementType.TYPE_PARAMETER | 1.8版本新增,应用于类型变量 |
ElementType.TYPE_USE | 1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
@Retention
表面该注解的生命周期。注解的级别,就是注解能留存到什么时候
生命周期类型 | 描述 |
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
@Document
表明该注解标记的元素可以被javadoc或类似的工具文档化
@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
实例
定义注解
// 表明该注解可以应用的java元素类型 TYPE:类/接口/枚举、FIELD:字段/属性
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyTarget {
String name() default "jack";
boolean isDelete() default false;
}
实体类
@Data
// 对外保持private setter,不对外公开属性的写操作
@Builder(toBuilder = true)
@MyTarget(isDelete = true, name = "BigHu")
public class Person {
private String name;
private Integer age;
private boolean isDelete;
}
利用反射解析注解
public class AnnotationTest {
public static void main(String[] args) {
// 获取Person的Class对象
Person person = Person.builder().name("Big.Hu").age(520).isDelete(true).build();
System.out.println("person对象:" + person.toString());
Person jack = person.toBuilder().age(20).name("jack").build();
System.out.println("jack: " + jack.toString());
Class<? extends Person> clazz = person.getClass();
/**
* isAnnotationPresent:判断当前元素是否被指定注解修饰
* getAnnotation:返回指定的注解
* getAnnotations:返回所有的注解
*/
// 判断person对象上是否有MyTarget注解
if (clazz.isAnnotationPresent(MyTarget.class)) {
System.out.println("Person类上配置了MyTarget注解");
MyTarget target = clazz.getAnnotation(MyTarget.class);
System.out.println("person.name: " + target.name() + ",person.isDelete: " + target.isDelete());
} else {
System.out.println("Person类上没有配置MyTarget注解");
}
}
}
猜你喜欢
- 2024-09-27 在Spring Boot项目中创建和使用自定义注解
- 2024-09-27 这一篇 Java 注解,写得太好了(java注解使用)
- 2024-09-27 学习廖雪峰的JAVA教程---注解(定义注解@interface)
- 2024-09-27 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?
- 2024-09-27 Spring Boot 整合mybatis,使用注解的方式(自动生成注解)
- 2024-09-27 面试官:实际工作中哪里用到了自定义注解?
- 2024-09-27 使用自定义注解和切面AOP实现Java程序增强
- 2024-09-27 Java-注解有什么用?该怎么用?(java 注解的作用)
- 2024-09-27 Java 17中的元注解:自定义注解的行为
- 2024-09-27 自定义注解你真会用吗?(说说自定义注解的场景及实现)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)