目录

1、注解的定义

1.1、定义一个注解

1.2、注解的使用

2、JDK内置注解

2.1、java.lang包下的注释类型

2.2、元注解

2.3、Deprecated注解

3、在注解中定义属性

3.1、获取注解类对象的属性

3.2、获取注解方法的属性

4、注解在开发中的作用


1、注解的定义

注解,或者叫注释类型(Annotation),是一种引用数据类型,编译之后生成xxx.class文件。

1.1、定义一个注解

  1. package Annotation;
  2. public @interface MyAnnotation {
  3. }

1.2、注解的使用

注解可以出现在类上、属性上、方法上、变量上等......注解也可以出现在注解类型上

  1. package Annotation;
  2. @MyAnnotation //注解修饰类名
  3. public class AnnotationTest01 {
  4. @MyAnnotation //注解修饰成员变量属性
  5. private String filed1;
  6. @MyAnnotation //注解修饰方法
  7. public void Method1() {
  8. }
  9. public void Method2(@MyAnnotation //注解修饰形参
  10. String x,
  11. @MyAnnotation
  12. String y) {
  13. }
  14. }
  1. package Annotation;
  2. @MyAnnotation_1 //注解修饰注解
  3. public @interface MyAnnotation {
  4. }

2、JDK内置注解

2.1、java.lang包下的注释类型

Deprecated用@Deprecated注释的程序元素

Override表示一个方法声明,重写超类中的另一个方法声明。@Override注解只在编译阶段起作用,是用来给编译器做参考的,和运行阶段无关。

2.2、元注解

元注解是用来标注“注解类型”的注解。常用的元注解有:Target   Retention

Target注解
@Target注解用来标注”被标注的注解“可以出现在哪些位置上。

  1. @Target(ElementType.METHOD) //表示被标注的只能出现在方法上(@Override只能出现在方法上)
  2. @Retention(RetentionPolicy.SOURCE)
  3. public @interface Override {
  4. }

Retention注解

@Retention注解用来标注”被标注的注解“最终保存在哪里

@Retention(RetentionPolicy.SOURCE); 表示该注解只被保留在java源文件中。

@Retention(RetentionPolicy.CLASS); 表示该注解只被保留在class文件中。

@Retention(RetentionPolicy.RUNTIME); 表示该注解只被保留在class文件中。并且可以被java反射机制所读取到。

源文件:源文件就是程序员们所编写出来的文件,程序员们能看懂的文件。即用java语言编写的以.java为后缀名的代码文件。

类文件:类文件则是利用java虚拟机生成的编译文件,是用来给机器看的机器语言,类文件是经过javac命令编译过后的字节码文件,以.class为后缀名。类文件通过jvm的翻译为本机能识别的机器语言,才能执行

2.3、Deprecated注解

@deprecated注解的作用是禁用一个类或者一个方法。虽然也会有输出值,但可以在Message看到Warning信息。

  1. package Annotation;
  2. /*
  3. 验证 @Deprecated注解的使用
  4. */
  5. public class AnnotationTest02 {
  6. public static void main(String[] args) {
  7. AT at = new AT();
  8. AR ar = new AR();
  9. at.doSome();
  10. ar.doAny();
  11. }
  12. }
  13. @Deprecated
  14. //禁用一个类
  15. class AT {
  16. public void doSome() {
  17. System.out.println("do something");
  18. }
  19. }
  20. class AR {
  21. @Deprecated //禁用一个方法
  22. public void doAny() {
  23. System.out.println("do anything");
  24. }
  25. }

3、在注解中定义属性

注解当中的属性类型可以是:byte,short,int,long,float,double,boolean,char,String,Class,enum类型以及每一种的数组形式

@MyAnnotation

  1. package Annotation;
  2. public @interface MyAnnotation {
  3. //在注解中定义属性
  4. String name();
  5. String sex();
  6. //default可以设置属性的默认值
  7. int age() default 22;
  8. String[] email();
  9. }

@MyAnnotation_1

  1. package Annotation;
  2. public @interface MyAnnotation_1 {
  3. String value();
  4. }
  1. package Annotation;
  2. public class AnnocationTest03 {
  3. @MyAnnotation(name = "张三", sex = "男", email = {"zhangsan@163.com", "zhangsan@126.com"})
  4. //age是有默认值,如果不进行设置age就是默认值为 22
  5. public void doA() {
  6. }
  7. @MyAnnotation_1("学生") //注解中只有一个value属性,则可以省略value=""。
  8. public void doB() {
  9. }
  10. }

3.1、获取注解类对象的属性

注解:@MyAnnotation_2

  1. package Annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. //设置该注解可以标注类,方法,属性
  7. @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
  8. //允许这个注解可以被反射
  9. @Retention(RetentionPolicy.RUNTIME)
  10. public @interface MyAnnotation_2 {
  11. String value(); //注解属性
  12. }

注解注解的类:AnnotationTest04

  1. package Annotation;
  2. @MyAnnotation_2("2020")
  3. public class AnnotationTest04 {
  4. }

输出注解的类的注解属性:ReflectAnnotationTest

  1. package Annotation;
  2. public class ReflectAnnotationTest {
  3. public static void main(String[] args) throws ClassNotFoundException {
  4. //获取加了@MyAnnotation_2注解的类的对象(AnnotationTest04)
  5. Class c = Class.forName("Annotation.AnnotationTest04");
  6. //判断类上面是否有 @MyAnnotation_2注解
  7. if (c.isAnnotationPresent(MyAnnotation_2.class)) {
  8. //获取注解对象
  9. MyAnnotation_2 myAnnotation_2 = (MyAnnotation_2) c.getAnnotation(MyAnnotation_2.class);
  10. String value = myAnnotation_2.value(); //获取注解对象属性
  11. System.out.println("注解的类的对象的value属性值为:" + value);
  12. }
  13. }
  14. }

3.2、获取注解方法的属性

注解:@MyAnnotation_5

  1. package Annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. //设置该注解可以标注类,方法,属性
  7. @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
  8. //允许这个注解可以被反射
  9. @Retention(RetentionPolicy.RUNTIME)
  10. public @interface MyAnnotation_5 {
  11. String username();
  12. String password();
  13. }

输出注解的方法的注解属性:AnnocationTest05

  1. package Annotation;
  2. import java.lang.reflect.Method;
  3. public class AnnocationTest05 {
  4. @MyAnnotation_5(username = "张三", password = "123456")
  5. public void login() {
  6. }
  7. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
  8. //获取AnnocationTest05类的login方法上的注解信息
  9. Class c = Class.forName("Annotation.AnnocationTest05");
  10. //获取login()方法
  11. Method loginMethod = c.getDeclaredMethod("login");
  12. //判断方法上是否存在这个注释
  13. if (loginMethod.isAnnotationPresent(MyAnnotation_5.class)) {
  14. MyAnnotation_5 myAnnotation_5 = (MyAnnotation_5) loginMethod.getAnnotation(MyAnnotation_5.class);
  15. System.out.println(myAnnotation_5.username());
  16. System.out.println(myAnnotation_5.password());
  17. }
  18. }
  19. }

4、注解在开发中的作用

一个例子:当一个类上面有@Id注解的时候,就要求该类中必须存在int类型的id属性。

注解:@Id

  1. package Annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Target(ElementType.TYPE)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface Id {
  9. }

异常类:HasNotIdPropertyException(用于对注解进行补充判断即判断被注解的类是否满足条件)

  1. package Annotation;
  2. public class HasNotIdPropertyException extends RuntimeException {
  3. public HasNotIdPropertyException() {
  4. }
  5. public HasNotIdPropertyException(String message) {
  6. super(message);
  7. }
  8. }

 User

  1. package Annotation;
  2. @Id
  3. public class User {
  4. int id; //注:如果这里不是int id就会抛出HasNotIdPropertyException异常
  5. String name;
  6. String sex;
  7. }

主类:AnnocationTest06 

  1. package Annotation;
  2. import java.lang.reflect.Field;
  3. public class AnnocationTest06 {
  4. public static void main(String[] args) throws ClassNotFoundException {
  5. //获取加了注解的类
  6. Class userClass = Class.forName("Annotation.User");
  7. if (userClass.isAnnotationPresent(Id.class)) {
  8. //当一个类上面有@Id注解的时候,就要求该类中必须存在int类型的id属性
  9. //如果没有int类型的id属性则报异常
  10. Field[] fields = userClass.getDeclaredFields(); //获取类的属性
  11. boolean result = false;
  12. for (Field field : fields) {
  13. if ("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())) { //用于判断被@Id注解的类中是否有 int id
  14. result = true;
  15. break;
  16. }
  17. }
  18. if (!result) {
  19. throw new HasNotIdPropertyException("被@Id注解的类中一定要有一个int类型的id属性");
  20. }
  21. }
  22. }
  23. }

总结:注解在框架中使用的比较广泛。框架开发都是基于注解模式开发,通过反射机制去读注解。

java注解总的来说可分为三种作用:

1、提供信息给编译器,如@Override,会提示要重写父类中的方法。

2、编译阶段时的处理,如Spring的常用注解@Controller,用@Controller注解标注一个类,在编译的时候,会把该类编译成一个控制器类。这样该类就可以处理DispatcherServlet 分发的请求。

@Deprecated注解用来标识过时的方法,如果用了被标注的过时方法,那么在程序编译的时候编译器会发出警告。

3、运行阶段的处理,如Spring的常用注解@RequestMapping,@RequestMapping是一个用来处理请求地址映射的注解,用@RequestMapping注解修饰类或方法。在程序运行阶段,web容器会根据@RequestMapping标注出的路径去找到相应的类或方法。

java注解基础知识整理的更多相关文章

  1. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  2. JAVA注解基础知识

    定义-摘自JAVA编程思想 注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后某个时刻能非常方便的使用这些数据. 背景: 注解是JAVA5的一种新特性,是为应对C#等之类对JAV ...

  3. Java正则表达式基础知识整理

    指定为字符串的正则表达式必须首先被编译为此类的实例.然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配.执行匹配所涉及的所有状态都驻留在匹配器中,所以多个 ...

  4. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  5. [转帖]java注解核心知识总结

    java注解核心知识总结 2019-11-01 20:39:50 从事Java 阅读数 2  收藏 文章标签: java注解总结程序员 更多 分类专栏: java 注解   版权声明:本文为博主原创文 ...

  6. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  7. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  8. java必备基础知识(一)

    学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...

  9. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  10. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

随机推荐

  1. 配置DNS域名解析服务

    概:   DNS技术作为互联网基础设施中的重要一环,为用户提供不间断.稳定且快速的域名查询服务,保证互联网正常运转.在互联网中,用户基本上都是基于DNS服务,使用域名访问网络上的计算机,DNS服务是我 ...

  2. 解决console控制台反复打印“WebSocket connection to ws://localhost:9528/sockjs-node/107/uadaszgz.websocket failed:Invalid frame header

    element-admin-vue 项目console台一直报websocket连接失败 解决办法 1.vue.config.js中配置devServer.proxy的ws为false  (我没成功) ...

  3. hyperf-搭建初始化

    官方文档* https://hyperf.wiki/2.0/#/README 初步搭建1. 安装项目 composer create-project hyperf/hyperf-skeleton 2. ...

  4. JUC(3)

    文章目录 1.集合类不安全 2.在高并发情况下arraylist()并不安全 3.高并发下set并不安全 3.测试map(高并发情况下出现问题) 1.集合类不安全 2.在高并发情况下arraylist ...

  5. vue Excel导入,下载Excel模板,导出Excel

    vue  Excel导入,下载Excel模板,导出Excel vue  Excel导入,下载Excel模板 <template> <div style="display: ...

  6. 物理服务器做系统盘centos

    linux系统跟windows系统都是操作系统的一种,安装的方法也较多,一样可以通过制作u盘启动盘给linux系统安装.那么具体是如何安装linux?下面就给大家演示下u盘启动盘安装linux系统教程 ...

  7. vulnhub靶场之CORROSION: 2

    准备: 攻击机:虚拟机kali.本机win10. 靶机:CORROSION: 2,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com ...

  8. 学习ASP.NET Core Blazor编程系列十——路由(上)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  9. 定制ASP.NET Core的身份认证

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本章,我们将学习如何定制ASP.NET Core认证机制.微软把安全认证当做AS ...

  10. 当 xxl-job 遇上 docker → 它晕了,我也乱了!

    开心一刻 公交车上,一位老大爷睡着了,身体依靠在背后的一位年轻小伙子身上 小伙子一直保持站姿十几分钟,直到老人下车 这位在校大学生,接受采访时说:"当时就觉得背后这个人很轻盈,以为是个姑娘! ...