-
2021-03-04 05:18:58
我有一个自定义注释如下.
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE,ElementType.METHOD })
@Documented
@Conditional(OnApiVersionConditional.class)
public @interface ConditionalOnApiVersion {
int[] value() default 5;
String property();
}
OnApiVersionConditional是,
public class OnApiVersionConditional implements Condition {
@Override
public boolean matches(final ConditionContext context,final AnnotatedTypeMetadata Metadata) {
final MultiValueMapMetadata.getAllAnnotationAttributes(ConditionalOnApiVersion.class.getName());
attributes.get("value");
final String inputVersion = context.getEnvironment().getProperty("userInputVersion");
}
在我的Bean注释中,
@Bean
@ConditionalOnApiVersion(value = {6,7},property = "userInputVersion")
还有像单一版本匹配的bean
@Bean
@ConditionalOnApiVersion(value = 8,property = "userInputVersion")
我想验证属性文件中的userInput版本到可用的Beans支持版本.不确定,如何获取值,迭代并与userInoutVersion进行比较.该值可以是8或{6,7}作为int数组.不确定,如何迭代该值以检查是否有任何值与输入版本匹配.
final List apiVersions = attributes.get(“value”).stream().collect(Collectors.toList());
题:
如何迭代attributes.get(“value”)并与userInputVersion进行比较?
attributes.get(“value”)返回一个Object列表.
我试过下面的代码,
final List
但得到以下错误在第二行anyMatch,
java.lang.ClassCastException: [I cannot be cast to java.lang.Integer
谢谢
更多相关内容 -
java 课件 数组、枚举及注解
2010-12-15 23:04:35java 课件 数组、枚举及注解 java 课件 数组、枚举及注解 java 课件 数组、枚举及注解 java 课件 数组、枚举及注解 -
Java注解用法
2021-03-11 10:15:10Java注解用法注解元素的提供值必须是编译时常量表达式,不能使用null作为注解中任何类型元素的值。基本类型注解类型中的元素的数据类型可以是任何基本数据类型:byte,short,int,long,float,double,boolean 和 ...Java注解用法
注解元素的提供值必须是编译时常量表达式,不能使用null作为注解中任何类型元素的值。
基本类型
注解类型中的元素的数据类型可以是任何基本数据类型:byte,short,int,long,float,double,boolean 和 char。
Version注释类型声明两个元素:major和minor,并且都是int数据类型。
以下代码声明了注解类型:
public @interface MyAnnotation {
byte a();
short b();
int c();
long d();
float e();
double f();
boolean g();
char h();
}
@MyAnnotation(a=1, b=2, c=3, d=4, e=12.34F, f=1.89, g=true, h='Y')
可以使用编译时常量表达式来指定注解元素的值。以下两个版本注释实例有效的:
@Version(major=2+1, minor=(int)13.2)
@Version(major=3, minor=13)
字符串类型
可以在注释类型中使用String类型的元素。以下代码定义了名为Name的注解类型。 它有两个元素:first和last,它们都是String类型。
public @interface Name {
String first();
String last();
}
@Name(first="Tom", last="Smith")
public class NameTest {
@Name(first="Jack", last="Iaan")
public void aMethod() {
}
}
在String类型的元素的值表达式中使用字符串连接+运算符是有效的。
@Name(first="Ja" + "ck", last="Ia" + "an")
Class类型
以下代码显示如何使用Class类型作为注解值。
import java.io.IOException;
@interface MyAnnotation {
Class extends Throwable> willThrow() default java.lang.Throwable.class;
}
public class Main {
@MyAnnotation(willThrow = IOException.class)
public static void testCase1() {
// Code goes here
}
@MyAnnotation()
public static void testCase2() {
}
}
枚举类型
注解可以具有枚举类型的元素。
enum Level {
PENDING, FAILED, PASSED;
}
@interface Review {
Level status() default Level.PENDING;
String comments() default "";
}
@Review(status = Level.PASSED)
public class Main {
}
注解类型
可以使用注解类型作为另一个注解类型的声明内的元素的类型。要为注解类型的元素提供值,请使用用于创建注解类型实例的语法。
@interface Name {
String first();
String last();
}
@interface Version {
int major();
int minor() default 0; // zero as default value for minor
}
@interface Description {
Name name();
Version version();
String comments() default "";
}
@Description(name = @Name(first = "Tom", last = "Smith"), version = @Version(major = 1, minor = 2), comments = "Just a test class")
public class Main {
}
注解可以具有数组类型的元素。数组类型可以是以下类型之一:
原始类型
java.lang.String类型
java.lang.Class类型
枚举类型
注解类型
需要在大括号中指定数组元素的值。数组的元素由逗号分隔。
@interface ItemList {
String[] items();
}
@ItemList(items = { "A", "B" })
public class Main {
}
如果数组中只有一个元素,则允许省略括号。
@ToDo(items={"A"})
@ToDo(items="A")
传递一个空数组
@ToDo(items={})
速记注解语法
假设有一个注释类型如下。
public @interface Enabled {
boolean status() default true;
}
要使用带有默认值的Enabled注解类型注释程序元素,可以使用status元素指定值,因为它具有默认值。可以进一步省略括号。
@Enabled
public class Main {
}
@Enabled()
public class Main {
}
只有一个元素的注解类型有速记语法。如果注释类型只有一个具有命名值的元素,可以省略name = value对中的名称。以下代码声明了 Company 注解类型,它只有一个名为value的元素:
public @interface Company {
String value();
}
当使用 Company 注释时,可以省略name = value对的名称。
@Company(value="Inc.")
public class Test {
}
变成 -
@Company("Inc.")
public class Test {
}
以下代码显示了如果元素数据类型是数组,如何使用缩写。
public @interface Item {
String[] value();
}
@Item({"A", "B"})
public class Test {
}
如果在数组注释类型中只指定一个元素,可以进一步省略括号。
@Item("A")
public class Test {
}
如果在使用注释时只提供一个值,则元素的名称为假设那个值。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
-
Java注解默认值
2021-02-26 20:45:14可以为注解中的元素定义默认值。不需要为带有默认值的注解元素提供值。默认值可以使用以下一般语法定义: @interface { () default ;}关键字default指定默认值。默认值必须是与元素的数据类型兼容的类型。以下代码...可以为注解中的元素定义默认值。不需要为带有默认值的注解元素提供值。
默认值可以使用以下一般语法定义:
@interface {
() default ;
}
关键字default指定默认值。默认值必须是与元素的数据类型兼容的类型。
以下代码通过将minor元素的默认值指定为0,来创建Version注释类型,如下所示:
public @interface Version {
int major();
int minor() default 0; // zero as default value for minor
}
示例
以下代码显示注解如何使用默认值。
@Version(major=1) // minor is zero, which is its default value
@Version(major=2, minor=1) // minor is 1, which is the specified value
以下代码显示如何为数组和其他数据类型指定默认值:
public @interface Version {
double d() default 1.89;
int num() default 1;
int[] x() default { 1, 2 };
String s() default "Hello";
String[] s2() default { "abc", "xyz" };
Class c() default Exception.class;
Class[] c2() default { Exception.class, java.io.IOException.class };
}
-
深入理解Java:注解(Annotation)自定义注解入门
2021-03-16 17:29:43元注解:元注解的作用就是负责注解...Java5.0定义的元注解:1.@Target,2.@Retention,3.@Documented,4.@Inherited这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和...元注解:
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。
@Target:
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
使用实例:
@Target(ElementType.TYPE)
public @interface Table {
/**
* 数据表名称注解,默认值为类名称
* @return
*/
public String tableName() default "className";
}
@Target(ElementType.FIELD)
public @interface NoDBColumn {
}
注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。
@Retention:
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String name() default "fieldName";
public String setFuncName() default "setField";
public String getFuncName() default "getField";
public boolean defaultDBValue() default false;
}
Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
@Documented:
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
public String name() default "fieldName";
public String setFuncName() default "setField";
public String getFuncName() default "getField";
public boolean defaultDBValue() default false;
}
@Inherited:
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
实例代码:
/**
*
* @author peida
*
*/
@Inherited
public @interface Greeting {
public enum FontColor{ BULE,RED,GREEN};
String name();
FontColor fontColor() default FontColor.GREEN;
}
自定义注解:
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
简单的自定义注解和使用注解实例:
package annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果名称注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
package annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果颜色注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
/**
* 颜色枚举
* @author peida
*
*/
public enum Color{ BULE,RED,GREEN};
/**
* 颜色属性
* @return
*/
Color fruitColor() default Color.GREEN;
}
package annotation;
import annotation.FruitColor.Color;
public class Apple {
@FruitName("Apple")
private String appleName;
@FruitColor(fruitColor=Color.RED)
private String appleColor;
public void setAppleColor(String appleColor) {
this.appleColor = appleColor;
}
public String getAppleColor() {
return appleColor;
}
public void setAppleName(String appleName) {
this.appleName = appleName;
}
public String getAppleName() {
return appleName;
}
public void displayName(){
System.out.println("水果的名字是:苹果");
}
}
注解元素的默认值:
注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。例如:
1 package annotation;
2
3 import java.lang.annotation.Documented;
4 import java.lang.annotation.ElementType;
5 import java.lang.annotation.Retention;
6 import java.lang.annotation.RetentionPolicy;
7 import java.lang.annotation.Target;
8
9 /**
10 * 水果供应者注解
11 * @author peida
12 *
13 */
14 @Target(ElementType.FIELD)
15 @Retention(RetentionPolicy.RUNTIME)
16 @Documented
17 public @interface FruitProvider {
18 /**
19 * 供应商编号
20 * @return
21 */
22 public int id() default -1;
23
24 /**
25 * 供应商名称
26 * @return
27 */
28 public String name() default "";
29
30 /**
31 * 供应商地址
32 * @return
33 */
34 public String address() default "";
35 }
定义了注解,并在需要的时候给相关类,类属性加上注解信息,如果没有响应的注解信息处理流程,注解可以说是没有实用价值。如何让注解真真的发挥作用,主要就在于注解处理方法,下一步我们将学习注解信息的获取和处理!
-
Java数组类详解
2021-08-10 10:10:05Java中经常会提到数组类型,因为java数组是类类型,当然,作为Java中常用的类Arrays,想要学习java数组类,我们必须先学好java数组,学起java数组类来才能事半功倍。本文就来和大家一起来学习Java数组类。 我们先来... -
Java数组
2021-03-09 18:39:43Java语言数组遍历教程Java语言数组遍历详解语法for(int i = 0;i< 数组名称.length;i++){数组名称[i];}说明我们在程序中,定义了一个变量 i,用 i 的值和数组的长度值比较,因为数组的索引是从 0 开始的,所以我们... -
java注解中一个参数是数组类型,为什么我可以指定一个数组元素而非数组为值
2016-04-27 03:28:03比如说@Target()这个注解,它的value是一个ElementType[]类型,为什么可以这样写: @Target(ElementType.METHOD) 这样类型可以匹配上吗?这不相当于把一个元素赋给了一个数组? -
Java 之 注解的定义
2021-03-09 20:50:16一、元注解1、元注解概述元注解:用于描述注解的注解2、常用的元注解(1)@Target:描述注解能够作用的位置Target 里面是一个 ElementType[] value() 的枚举数组,这个数组里面指定了10个常量对象。源码:1 public ... -
Java中的注解
2021-03-09 20:45:10java中常见的注解@Override:作用在方法上的注解。当方法不是重写父类的方法时会报错;(这个注解可以帮我们检查覆盖是否正确。覆盖时推荐必须使用这个,增强阅读性。由于这个注解在运行时没啥作用,所以它的保留策略... -
Java——自定义注解
2021-03-18 00:09:24一,自定义注解类@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited //继承对接口是无用的;继承的时候只会集成到类上面的注解,不会继承到方法上的注解@... -
Java:注解(Annotation)自定义注解入门
2021-03-09 20:45:24转载地址:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解... -
(java)数组定义的基本格式(动态初始化,静态初始化)和省略格式
2021-04-11 13:15:30数组的概念:是一种容器可以同时存储多个数据值 数组的特点: 1、数组是一种引用数据类型 2、数组当中的多个数据,类型必须统一 3、数组的长度在程序运行期间是不可以修改的 数组的初始化: 在内存中创建一个数组,... -
java – 如何在注释中使用数组常量
2021-03-01 07:20:25} 常量Info.A和Info.B可以在注释中使用,但不能在数组Info.AB中使用,因为它必须是此位置中的数组初始值。注释值被限制为可以内联到类的字节代码中的值。这是不可能的数组常量,因为它必须构建时,信息加载。这个... -
Java的注解
2021-02-02 18:03:00注解并不是一开始就有的,JDK5之前是没有注解的,JDK5及其以后JDK版本才开始支持Java注解! Java注解(Annotation)也叫做元数据,以@注解名在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的... -
java中为数组赋值的方法
2021-02-12 09:04:35java中为数组赋值的方法发布时间:2020-06-25 14:31:36来源:亿速云阅读:184作者:Leah这期内容当中小编将会给大家带来有关java中为数组赋值的方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章... -
Java中数组的定义与使用
2021-09-26 14:46:21Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName;type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明... -
java打印一维数组
2021-12-27 19:01:38文章目录前言System.out.println()语句直接打印数组出错Java打印一维数组的方法1.for 和for-each循环1.for循环2.for-each 循环示例:2. Arrays.toString() 方法3. Arrays.deepToString() 方法4. Arrays.asList() ... -
Java进阶之光!java将数组拼接成一个字符串
2021-07-22 12:03:55Java基础 1.Java语言的三大特性 2.Java语言主要特性 3. JDK和JRE有什么区别 4.Java基本数据类型及其封装类 5.如果main方法被声明为private会怎样? 6.说明- -下public static void main(String argsQ])这段声明里每... -
使用Java进行Json数据的解析(对象数组的相互嵌套)
2020-10-19 08:20:46下面小编就为大家带来一篇使用Java进行Json数据的解析(对象数组的相互嵌套)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
json字符串转java对象数组
2021-03-12 22:18:21主要疑问区分和说明: 1.1 @XmlElementWrapper 注解 对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的 XML 元素(称为包装器.如果不加该注解,集合中的每个对象的父节点不是 List 了,而是... -
Spring @Value 设置默认值的实现
2021-03-14 15:55:521.概览spring 的 @vaule 注解提供了一种便捷的方法可以让属性值注入到组件中,当属性值不存在的时候提供一个默认值也是非常好用的这就是我们这篇文章所专注的,如何给 @vaule 注解指定一个默认值。对于更多的关于 @... -
Java中判断数组是否为空?
2022-04-03 20:38:581.判断数组是否为空? String[] suzu = new String[]{}; // 判断suzu不为null if(suzu != null){ } 2.判断集合是否为空? List<String> list = Lists.newArrayList(); // 判断集合list是否为空,同时判断... -
JAVA 给数组乱序 之 下标乱序
2021-03-08 10:18:53因为现在我也是在新手阶段使用的时候请先认真看我的注解,这个代码我是测试过才放上来的,绝对没错的有问题欢迎留言,共同发现,彼此进步。importjava.util.Random;/**对指定长度的数组进行乱序(下标乱序)*/... -
Java数组String []的用法详解
2021-02-26 18:25:56Java数组是在Java编程中经常使用的一个类,下面是对Java数组的使用说明。1.Java数组的语法:String[数组下标], Java数组的下标是从0开始的。2.示例代码public class StringArray{public static void main(String[]... -
mybatis使用注解处理数组或者集合参数
2021-03-01 23:38:03在带注解的映射器接口中使用动态SQL,可以使用script元素 2、where元素: 只有<where>元素内的条件成立时,才会在拼装SQL语句时加上where关键字 3、foreach元素 <foreach>元素主要是迭代一个集合,在SQL... -
java数组求和函数
2021-06-19 15:23:13什么是基于Java的 Spring注解配置?给一些注解的例子 45.你更倾向用那种事务管理类型? 46.Bean的调用方式有哪些? 47.Spring MVC里面拦截器是怎么写的 48.当一个方法向AJAX返回特殊对象,壁如Object、List 等,需要做...