博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Annotation In Java
阅读量:6589 次
发布时间:2019-06-24

本文共 2057 字,大约阅读时间需要 6 分钟。

hot3.png

1. 注解的应用场景

Java注解就是源代码里面的以为用来标识代码的一些元信息,没有相关处理这些注解的代码的话,这些注解就是文本文档(没有用处);主要应用场景是:

  1. JavaDoc,(比如注释里面的@Param)
  2. javaCompile(告诉编译器一些信息编译器会相应比如@SuppressWarnings,@Override),
  3. JavaRuntime(主要是用来做反射相关的东西,比如Spring全家桶 @Autowire等等)

2. 元注解(用来描述注解的注解)

@Retention /*** 表示所描述的注解有效期,取值范围* RetentionPolicy.SOURCE 只在源代码时有效,一般就是生成JavaDoc这类工具会使用比如@Override等等,编译器不会处理这些注解* RetentionPolicy.CLASS 在编译期有效,编译器会读取处理这些注解,生成class文件会有这些注解,但是通过反射是获取不到的,默认是这个级别,但是是假的默认;既然加注解默认都是要反射搞事情的。。* RetentionPolicy.RUNTIME 运行时有效,class文件里面有,通过反射包可以获取到这些注解,这个才是真默认*/@Documented /** * 生成JavaDoc时,@Documnet所描述的注解--这个注解所描述的元素会加到javadoc里面,别管没什么用... */@Target/** * 描述注解能用在什么地方;取值范围注意是个数组 * ElementType.ANNOTATION_TYPE 可以被加在注解上 * ElementType.CONSTRUCTOR 可以被加在构造器上, * ElementType.FIELD 可以被加在类的属性成员上 * ElementType.LOCAL_VARIABLE 可以被加在本地变量上 * ElementType.METHOD 可以被加在类的方法上 * ElementType.PACKAGE 可以被加在package上. * ElementType.PARAMETER 可以被加在方法的参数上 * ElementType.TYPE 可以被加在类上 */@Inherited/** * 表示这个注解是否可以被子类继承,默认不行 * 假定A class test()方法被TestAnno 标记, * TestAnno  被Inherited 标记,  * 那么 B 从A 继承后,尽管B的代码 没有任何TestAnno代码 * 但是使用反射包对ClassB.getMethodsByName("test").forEach(getAnnotations())... * 是会有TestAnno */@Repeatable/** * 表示这个注解是否可以使用多次,在同一个元素上,默认false * 1.8 以后才有的 */

3. 怎么获取注解相关信息

  1. 反射包里面的Class.Method等等工具类

4. 一个自定义注解及解释

@Target({ElementType.METHOD,ElementType.TYPE})//可以被用在方法及类上@Retention(RetentionPolicy.RUNTIME)//运行时,@Inherited//可被继承的public @interface Controller{    String value() ;//需要给个字符串    String [] methods();//需要给个字符数组}

使用的话就这么使用:

@Controller(value="/helloworld",method={"POST","GET"})public class HelloWorldController{    @Controller(value="/index",method={"POST","GET"})    public String helloworld(){        return "helloworld";    }}

如上假定实现了类似于SpringMVC的功能,那么 通过GET http://localhost:port/helloworld/index 就可以获取到"helloworld";

一个子类

@Controller(value="/helloworldsub",method={"POST","GET"})public class HelloWorldControllerSub extends{}

如上假定实现了类似于SpringMVC的功能,那么通过GET http://localhost:port/helloworldsub/index 也可以获取到"helloworld"字符串,因为我们定义的@Controller 是Inherited

转载于:https://my.oschina.net/Aruforce/blog/3049860

你可能感兴趣的文章
内购开发指南
查看>>
smarty foreach
查看>>
start.sh
查看>>
MathType几个常用字体的名称
查看>>
Flex 布局教程:语法篇
查看>>
Spring MVC 3.2+ @ResponseBody 导致的中文乱码处理
查看>>
Thread.currentThread().getContextClassLoader()和Class.getClassLoader()区别
查看>>
Dubbo zookeeper 初探【转】
查看>>
读写分离无效的大坑(新使用数据库读写分离的同学可以参考)
查看>>
这么多年被第三方接入坑的那些事。。。关于md5签名和sha1证书的坑
查看>>
淘宝SOA框架dubbo学习(4)--参数验证
查看>>
大话说github建立里程碑(SE)
查看>>
将当前登录用户去重显示。
查看>>
AWS使用记录
查看>>
传输层
查看>>
J2EE 架构师之路
查看>>
DisplayPort接口最详解析
查看>>
struts2的json插件配置详解
查看>>
bootstrap多模态框
查看>>
【翻译】RAID, Auto Volume, HBA, Simple Volume模式之间的区别
查看>>