今天我继续来介绍java中的注解。注解与接口和类不同的是注解是不允许继承的,但是注解中有一个和继承有关的元注解:@Inherited。如果我们在定义注解时候加上这个元注解那么我们就可以在子类中监测到该注解的存在。

@Target(ElementType.TYPE)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface Action {boolean isSingle() default true;String value() default "";String url() default "";
}@Action
class BaseController{
}public class UserController extends BaseController{public static void main(String[] args) {System.out.println(UserController.class.isAnnotationPresent(Action.class)); //trueSystem.out.println(BaseController.class.isAnnotationPresent(Action.class)); //true}
}

如上代码所示:我在BaseController上加了Action的注解但是没有在UserController上加但是我却可以在UserController类上检查到Action注解的存在就是因为我们在定义注解时加了@Inherited。

我们现在已经可以自己创建注解,接下来我来给大家介绍如何获取注解的信息。在java中是通过反射来获取注解的信息的,在Class,Method,Field,Constructor中都有如下的这几个方法:getAnnotations()获取所有的注解,getDeclaredAnnotations获取所有声明的注解,忽略inherited来的注解,getAnnotations(Class<A> annotationclass)获取指定类型的注解,isAnnotationPresent(Class<A> annotationclass)判断是否有指定类型的注解。下面我来通过代码来获取类上的注解:

@Target(ElementType.TYPE)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Action {boolean isSingle() default true;String value() default "";String url() default "";
}@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Service {String value() default "";String url() default "";
}@Action(value="action",url="actionurl")
@Service(value="service",url="serviceurl")
class BaseController{
}public class UserController extends BaseController{public static void main(String[] args) throws ClassNotFoundException {Class<BaseController> cls = BaseController.class;Annotation[] annotations = cls.getAnnotations();for (Annotation annotation : annotations) {if(annotation instanceof Action){Action action = (Action)annotation;System.out.println(action.url());    //actionurlSystem.out.println(action.value());  //action}if(annotation instanceof Service){Service service = (Service)annotation;System.out.println(service.url());   //serviceurlSystem.out.println(service.value());  //service}}}
}

在java中Method和Contructor都有方法参数,而参数也是可以有注解的,所以有一个方法返回参数的注解:getParameterAnnotations()返回值是一个二维数组。我们来看一个例子:

public class TestMethodAnnotations {@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)static @interface requestParam {String value();}@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)static @interface DefaultValue {String value() default "";}public void test(@requestParam("useranme") String username,@requestParam("password") @DefaultValue("1234") String password){}public static void main(String[] args) throws NoSuchMethodException, SecurityException {Class<TestMethodAnnotations> cls = TestMethodAnnotations.class;Method method = cls.getMethod("test",new Class[]{String.class,String.class});Annotation[][] anns =  method.getParameterAnnotations();for (Annotation[] annotations : anns) {for (Annotation annotation : annotations) {if(annotation instanceof requestParam){requestParam request = (requestParam)annotation;System.out.println(request.value());}if(annotation instanceof DefaultValue){DefaultValue defaultValue = (DefaultValue)annotation;System.out.println(defaultValue.value());}}}}
}

代码还是比较的简单的,在这个例子中我们使用@requestParam和@DefaultValue两个注解来修饰方法的参数然后使用getParameterAnnotations这个方法来获取方法参数上的注解。

通过注解我们可以实现很多的功能,比如依赖注入,绑定参数等等,掌握注解的使用有利于我们日常的开发并且为日后学习框架打下基础。

转载于:https://www.cnblogs.com/suyang-java/p/10886092.html

java中的注解(二)相关推荐

  1. Java中的注解(Annotation)处理器解析

    Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的 ...

  2. Java中自定义注解的使用

    Java中自定义注解的使用 一般来说,市面上有一些的框架,企业都不会直接拿过来就用,通过会做二次开发或封装,为了更加适配自己的开发规范和业务.那么在封装或适配的过程中,自定义注解就起着比较重要的作用. ...

  3. 详解Java中的注解

    在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注 ...

  4. 五十八、深入了解 Java 中的注解和自定义注解

    @Author:Runsen @Date:2020/7/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. 22、java中的注解

    注解是什么? 注解可以理解成注释.标记.标签的意思,用来标记类.方法等.就相当于现实生活中的一些事物,上边贴一个标签或者写一些注释性文字来描述它可以用来做什么.怎么用.何时用等信息.Java中的注解也 ...

  6. Java中的注解是如何工作的

    转载自 Java中的注解是如何工作的? 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecate ...

  7. 深入理解JAVA中的注解

    本文来说下JAVA中的注解,这个技术虽然我们每天都在使用,但是不一定知道其实现原理.本文来详细介绍下JAVA中注解相关的知识. 文章目录 概述 什么是注解 注解的本质是什么 注解体系图 常用元注解 @ ...

  8. 注解以及Java中常用注解使用

    元注解有六个: @Target(表示该注解可以用于什么地方). @Retention(表示再什么级别保存该注解信息). @Documented(将此注解包含再javadoc中). @Inherited ...

  9. Java中的注解--annotation

    Java中的基本注解,几乎框架中的注解都是依赖Java中的基本注解,很有必要学习一下Java中的基本注解...jdk 5 增加的新特性 一.注解的定义以及Java中常见的注解 注解就相当于一种标记,加 ...

最新文章

  1. 最新离婚大数据曝光:所有的分手,都是蓄谋已久
  2. python编程100例头条-我用Python编程语言做了一些神奇好玩的事情
  3. 2017/11/3模拟赛
  4. 自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询
  5. Problem B: C语言习题 矩阵元素变换
  6. STM32F103+CubeMX-Keil上移植RTX5实时系统
  7. NVIDIA Parallel Nsight
  8. Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化
  9. 绘图之使用工作空间直接绘图
  10. tplink连接服务器失败_TPLINK无线路由WDS(桥接)设置方法图解教程 距离远增强wifi信号...
  11. 百度网盘下载一直请求中
  12. 时间转换 Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)
  13. Labview筛选符合条件的数据
  14. python多线程网易云歌单
  15. 协同创新 强省惠民 | 山东省数据应用创新创业大赛主赛场等你来战
  16. AI自动剪辑生成视频探索实践
  17. MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
  18. arduino wifi_Arduino MKR WiFi 1010
  19. Neuroimage | 孤独症与功能近红外光谱(fNIRS)综述
  20. 基于C++的UKF代码示例,跟踪三次多项式曲线

热门文章

  1. DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优
  2. 一、javaSE (二十三)多线程
  3. 一些使用Vim的小技巧
  4. cocos2dx-3.9 集成admob
  5. 高性能ORM框架XLinq功能详细介绍
  6. java中两个Integer类型的值相比较的问题
  7. Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力
  8. k8s使用kube-router网络插件并监控流量状态
  9. 如何在SAP云平台上使用MongoDB服务
  10. es6箭头函数(=)与展开特性运算符(...)的使用