这篇文章主要讲解了“Java 8注解语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java 8注解语法有哪些”吧!
注解语法
注解由字符 @ 和注解名组成,即 @AnnotationName。当编译器发现这个语法该元素时,会把它解析为注解。例如:
@ExampleAnnotation
public class SampleClass {
}
上面的注解称为 ExampleAnnotation,标记在 SampleClass 上。
注解可以包含属性,在声明注解时以键值对的形式给出。例如:
@ExampleAnnotation(name = ”first name”, age =
35)
public void simpleMethod() {
}
请注意,这里 ExampleAnnotation 是一个方法注解。如果注解只包含一个属性,在声明注解时可以忽略属性名。示例如下:
@ExampleAnnotation(“I am the only property”)
public void simpleMethod() {
}
一个元素可以使用多个注解。比如下面这个示例:
@Annotation1
@Annotation2(“Another Annotation”)
public class SimpleClass {
}
从 J2SE 8 开始,可以为同一个元素多次使用相同的注解,例如:
@ExampleAnnotation(“Annotation used”)
@ExampleAnnotation(“Annotation repeated”)
public class SimpleClass {
}
在 @Repeatable 部分会对此进行详细地讨论。
Java 预定义注解
Java 支持一组预先定义好的注解。下面介绍了Java Core 中提供的注解:
@Retention:
SOURCE:注解仅在源代码中可用。编译器和 JVM 会忽略此注解,因此在运行时不可用;
CLASS:编译器会处理该注解,但 JVM 不会处理,因此在运行时不可用;
RUNTIME:JVM 会处理该注解,可以在运行时使用。
@Target:
ANNOTATION_TYPE:可修饰其他注解;
CONSTRUCTOR:可以修饰构造函数;
FIELD:可以修饰字段或属性;
LOCAL_VARIABLE:可以修饰局部变量;
METHOD:可以修饰 method;
PACKAGE:可以修饰 package 声明;
PARAMETER:可以修饰方法参数;
TYPE:可以修饰 Class、Interface、Annotation 或 enum 声明;
PACKAGE:可以修饰 package 声明;
TYPE_PARAMETER:可以修饰参数声明;
TYPE_USE:可以修饰任何类型。
@Documented:@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE_USE)
@Repeatable (RepeatableAnnotationContainer.class)
public @interface
RepeatableAnnotation() {
String
values();
}
RepeatableAnnotation可以重复修饰元素。
接下来,定义 RepeatableAnnotationContainer注解类型。这是一个注解类型容器,包含一个 RepeatableAnnotation 类型的数组。
public @interface RepeatableAnnotationContainer {
RepeatableAnnotation [] value();
}
现在,Repeatable 可以元素进行多次注释。
@RepeatableAnnotation (“I am annotating the class”)
@RepeatableAnnotation (“I am annotating the class again”)
@RepeatableAnnotation (“I am annotating the classfor the third time”)
publicclass RepeatedAnnotationExample {function(){ //外汇跟单www.gendan5.com}
在程序中要获取注解中的值,先要获取容器中的数组,数组的每个元素将包含一个值。例如:
@RepeatableAnnotation (“I am annotating the
class”)
@RepeatableAnnotation (“I am annotating the
class again”)
@RepeatableAnnotation(“I am annotating the
class for the third time”)
public class RepeatableAnnotationExample {
public static void main(String [] args) {
Class object = RepeatableAnnotationExample.class
Annotation[] annotations = object.getAnnotations();
for (Annotation annotation : annotations) {
RepeatableAnnotationContainer rac = (RepeatableAnnotationContainer) annotation;
RepeatableAnnotation [] raArray = rac.value();
for (RepeatableAnnotation ra : raArray) {
System.out.println(ra.value);
}
}
}
}
执行结果:
I am annotating the
class
I am annotating the
class again
I am annotating the
class for the third time.
类型注解
Java 8发布后,注解可以用于任何类型(Type),这意味着只要可以使用类型的地方就能使用注解。例如,使用新运算符创建类实例、类型转换、用 implements 实现接口、抛出异常等,这种注解称为类型注解。
这种注解能够帮助分析与改进 Java 程序,提供更强大的类型检查。Java 8发布前,Java 没有提供类型检查框架。但是通过类型注解可以开发类型检查框架,对 Java 程序进行检查。
举例来说,假设我们希望特定变量在程序执行过程中始终不为 null。可以编写一个自定义插件 NonNull,并为特定变量加上该注解进行检查。变量声明如下:
@NonNull String notNullString;
编译代码时,如果发现任何可能将变量赋值为 null 的代码,编译器会检查潜在问题并给出告警。
自定义注解
Java 允许程序员自定义注解。自行定义注解的语法:
public @interface CustomAnnotation { }
上面的代码会创建一个 CustomAnnotation新注解。@Interface 关键字可用于自定义注解。
自定义注解时,必须设置两个必填属性。可以在定义中增加其他属性,但这两个重要属性是必需的,即@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.ELEMENT)
public @interface CustomAnnotation {
public String
name() default “Mr Bean”;
public String
dateOfBirth();
}
上面的自定义注解中,Retention Policy 为 RUNTIME,这表明该注解可以在 JVM 运行时使用;Target 设为 ELEMENT,表示该注解可以修饰任何元素与类型。
此外,它还具有两个属性:name 与 dateOfBirth。其中,name 属性默认值为 Mr Bean, dateOfBirth 没有默认值。
注意,声明的 Method 没有带任何参数以及 throws 语句。此外,返回类型仅限于 String、class、enum、注解以及上述类型的数组。
现在,可以像下面这样使用自定义注解:
@CustomAnnotation (dateOfBirth = “1980-06-25”)
public class CustomAnnotatedClass {
}
同样,可以使用 @Target(ElementType.METHOD) 创建自定义注解修饰 method。
获取注解及属性
Java Reflection API 提供了几种方法,可以在运行时中从 class、method 和其他元素中获取注解。
AnnotatedElement接口定义了所有的方法,其中最重要的一个是:
getAnnotations(): 返回指定元素的所有注解,包括定义元素时未明确写出的注解。
isAnnotationPresent(annotation): 检查注解在当前元素上是否可用。
getAnnotation(class): 获取 class 参数使用的注解,如果参数不存在注解返回 null。
这个 class 支持 java.lang.Class、java.lang.reflect.Method 和 java.lang.reflect.Field,基本上可以适用任何的 Java 元素。
下面的示例程序展示了如何获取自定义注解的相关信息:
public static void main(String [] args) {
Class object = CustomAnnotatedClass.class;
// 从类中获取所有注解
Annotation[] annotations = object.getAnnotations();
for( Annotation annotation : annotations ) {
System.out.println(annotation);
}
// 检查是否存在注解
if( object.isAnnotationPresent( CustomAnnotationClass.class ) ) {
// 获取需要的注解
Annotation annotation = object.getAnnotation(CustomAnnotationClass.class) ;
System.out.println(annotation);
}
// 获取注解属性
for(Annotation annotation : annotations) {
System.out.println(“name: “ + annotation.name());
System.out.println(“Date of Birth: “+ annotation.dateOfBirth());
}
// 对所有方法执行相同的操作
for( Method method : object.getDeclaredMethods() ) {
if( method.isAnnotationPresent( CustomAnnotationMethod.class ) ) {
Annotation annotation = method.getAnnotation(CustomAnnotationMethod.class );
System.out.println( annotation );
}
}
}
感谢各位的阅读,以上就是“Java 8注解语法有哪些”的内容了,经过本文的学习后,相信大家对Java 8注解语法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。