Java注解开发的使用
注解
定义:
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性。与类、接口、枚举、是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
- 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
- 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【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. 属性
在接口中定义的方法就是它的属性;
- 必须得有返回结果
- 返回的必须是以下类型:
- 基本数据类型
- 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() { } }
属性值赋值的注意点:
- 如果定义属性时,使用default关键字给属性默认初始值,可以在使用注解时不赋值,如上age()
- 如果只有一个属性需要赋值,而且该属性的名称是value那么在赋值时,可以省略"value = "
- 数组赋值的时候,值使用{}包裹,如果数组中只有一个值,那么{}可以省略
4. 元注解
JDK中提供的4个元注解
- @Target:描述当前注解能够作用的位置
- ElementType.TYPE:可以作用在类上
- ElementType.METHOD:可以作用在方法上
- ElementType.FIELD:可以作用在成员变量上
- @Retention:描述注解被保留到的阶段
- SOURCE < CLASS < RUNTIME
- SOURCE:表示当前注解只在代码阶段有效
- CLASS:表示该注解会被保留到字节码阶段
- RUNTIME:表示该注解会被保留到运行阶段JVM
- 自定义的注解:RetentionPolicy.RUNTIME 常用,保留到运行时
- @Documented:描述注解是否被抽取到JavaDocAPI中
- @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); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~