获取同一类型多个注解

​ jdk1.8的java.lang.Class类新增了方法getAnnotationsByType方法,该方法可以获取某一个类型的注解列表,具体代码示例如下:

public class AnnotationTest {

	@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Filters {
Filter[] value();
} @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Filters.class)
public @interface Filter {
String value();
} @Filter("filter1")
@Filter("filter2")
public interface Filterable { } @Filters({@Filter("filter1"), @Filter("filter2")})
public interface Filterable2 { } public static void main(String[] args) {
for (Filter filter : Filterable.class.getAnnotationsByType(Filter.class)) {
System.out.println(filter.value());
}
for (Filters filter : Filterable.class.getAnnotationsByType(Filters.class)) {
System.out.println(filter.value().length);
}
for (Filter filter : Filterable2.class.getAnnotationsByType(Filter.class)) {
System.out.println(filter.value());
}
for (Filters filter : Filterable2.class.getAnnotationsByType(Filters.class)){
System.out.println(filter.value().length);
}
}
} 输出如下:
filter1
filter2
2
filter1
filter2
2

更好的类型推断

​ 上面可以看出getOrDefault第二个参数的类型可以通过第一个参数来推断,如果在jdk1.8之前,需要写成如下形式:

value.getOrDefault("asas", Value.<String>defaultValue());

注解的进一步扩展

  • jdk1.8扩展了注解的上下文,现在注解几乎可以加到任何地方:局部变量、泛型类、⽗类与接⼝的实现,就连⽅法的异常也能添加注解
  • ElementType.TYPE_USE和ElementType.TYPE_PARAMETER是两个新添加的⽤于描述适当的注解上下⽂的元素类型

图说jdk1.8新特性(3)--- 注解与类型推测优化的更多相关文章

  1. 图说jdk1.8新特性(1)--- 函数式接口

    函数式接口 总结起来就以下几点: 如果一个接口要想成为函数接口(函数接口可以直接用lambda方式简化),则必须有且仅有一个抽象的方法(非default和static) 可以通过注解@Function ...

  2. 图说jdk1.8新特性(5)--- 编译器新特性

    /** * Returns the name of the parameter. If the parameter's name is * {@linkplain #isNamePresent() p ...

  3. 图说jdk1.8新特性(4)--- stream

    总述 jdk1.8引入了Stream相关的API,通过该API.可以实现流式编程,使你写代码的时候行云流水 Stream使得集合的转换变得更加简单,原来可能需要写多个for循环或者多个if判断的,直接 ...

  4. JDK1.5新特性之注解

    时间:2017-1-2 20:14 --注解的概述    注释是给人看的,而注解是给程序(框架)看的.    在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解 ...

  5. 图说jdk1.8新特性(2)--- Lambda

    简要说明 jdk常用函数式接口 Predicate @FunctionalInterface public interface Predicate<T> { boolean test(T ...

  6. Java8新特性 重复注解与类型注解

    import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.anno ...

  7. JDK1.7新特性(2):异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

  8. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  9. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

随机推荐

  1. Linux下安装java及配置(yum安装)

    1.查看java的所有版本:yum list java* 2.安装免费版1.8: yum install java-1.8.0-openjdk.x86_64 3.配置java环境 JAVA_HOME= ...

  2. git push ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/Operater9/guest' hint: Updates were rejected because the tip of your current bra

    推送本地代码到github报错 git push报错 ! [rejected] master -> master (non-fast-forward) error: failed to push ...

  3. 为什么JDK代码这样写?final ReentrantLock takeLock = this.takeLock

    在CopyOnWriteArrayList的源码中有一个细节值得学习,就是在addIfAbsent方法中ReentrantLock的用法,先是将一个这个成员变量this.lock重新赋值给一个局部变量 ...

  4. SpringBoot入门-多环境文件配置(二)

    pom.xml <name>springboot-application</name> <description>A project for Spring Boot ...

  5. BATJ都爱问的多线程面试题

    # 一 面试中关于 synchronized 关键字的 5 连击 ### 1.1 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同 ...

  6. BootStrap table服务端分页

    涉及到的内容: 1.bootstrap-table插件: 2.mybatisplus分页查询: 3.spring封装对象匹配bootstrap-table插件格式: 4.sql查询隐藏手机号中间四位. ...

  7. cmake 指定gcc/g++版本

    export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++ cmake /path/to/your/project make

  8. siglongjmp和sigsetjmp 用法

    1. 引入原因 由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sig ...

  9. 转 python2 与 python3 的编码

    原文链接:https://blog.csdn.net/xufive/article/details/102726739 引文如下: 无论是py2还是py3,都使用unicode作为内存编码,简称内码. ...

  10. &和&&的区别?

    &运算符有两种用法:(1)按位与:(2)逻辑与.&&运算符是短路与运算.逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是tr ...