@interface是用来自定义JAVA Annotation的语法,普通的开发人员可能很少用到它,但是它的功能很强大,本文将具体介绍@interface的用法!
@interface是用来自定义注释类型的,如果你不了解Java注释,可以参阅上一篇文章:"JDK5.0注释(Annotation)的用法"。
一般的应用程序开发人员可能从不需要定义一个注释类型,但定义我们自己的注释类型并不复杂。注释类型的定义跟定义一个接口相似,我们需要在 interface这个关键字前面加上一个@符号,即@interface。注释中的每一个方法定义了这个注释类型的一个元素,注释中方法的声明中一定不能包含参数,也不能抛出异 常;方法的返回值被限制为简单类型、String、Class、emnus、注释,和这些类型的数组。方法可以有一个缺省值。这里是一个注释类型定义的例 子:
/**
* Describes the Request-For-Enhancement(RFE) that led
* to the presence of the annotated API element.
*/
public @interface RequestForEnhancement {
int id();
String synopsis();
String engineer() default "[unassigned]";
String date(); default "[unimplemented]";
}
一旦定义好了一个注释类型,你就可以用来作注释声明。注释一中特殊的修饰符,在其他修饰符(比如public,static,或者final等) 使用地方都可以使用。按照惯例,注释应该放在其他修饰符的前面。注释的声明用@符号后面跟上这个注释类型的名字,再后面跟上括号,括号中列出这个注释中元 素/方法的key-value对。值必须是常量。这里是一个例子,使用上面定义的注释类型:
@RequestForEnhancement(
id = 2868724,
synopsis = "Enable time-travel",
engineer = "Mr. Peabody",
date = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }
没有元素/方法的注释被成为标记(marker)注释类型,例如
/**
* Indicates that the specification of the annotated API element
* is preliminary and subject to change.
*/
public @interface Preliminary { }
标记注释在使用的时候,其后面的括号可以省略,例如
@Preliminary public class TimeTravel { ... }
如果注释中仅包含一个元素,这个元素的名字应该为value,例如:
/**
* Associates a copyright notice with the annotated API element.
*/
public @interface Copyright { String value(); }
如果元素的名字为value,使用这个注释的时候,元素的名字和等号可以省略,如:
@Copyright("2002 Yoyodyne Propulsion Systems")
public class OscillationOverthruster { ... }
为了将上面提到的东西结合在一起,我们创建了一个简单的基于注释的测试框架。首先我们需要一个标记注释类型用以说明一个方法是一个测试方法,并被测试工具执行。
import java.lang.annotation.*;
/**
* Indicates that the annotated method is a test method.
* This annotation should be used only on parameterless static methods.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test { }
我们可以注意到这个注释类型本省也被注释了,这种注释叫做元注释。第一注释 (@Retention(RetentionPolicy.RUNTIME))表示这种类型的注释被VM保留从而使其能够通过反射在运行时读取;第二个注 释@Target(ElementType.METHOD)表示这种注释只能用来注释方法。
下面是一个简单的类,其中的几个方法被加了上面的注释:
public class Foo {
@Test public static void m1() { }
public static void m2() { }
@Test public static void m3() {
throw new RuntimeException("Boom");
}
public static void m4() { }
@Test public static void m5() { }
public static void m6() { }
@Test public static void m7() {
throw new RuntimeException("Crash");
}
public static void m8() { }
}
这里是测试工具:
import java.lang.reflect.*;
public class RunTests {
public static void main(String[] args) throws Exception {
int passed = 0, failed = 0;
for (Method m : Class.forName(args[0]).getMethods()) {
if (m.isAnnotationPresent(Test.class)) {
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {
System.out.printf("Test %s failed: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
}
}
这个工具用一个类名作为参数,遍历这个类中的所有方法,并调用其中被加了@Test注释的方法。如果一个方法抛出了一个异常,那么这个测试就失败了,最终的测试结果被打印了出来。下面是程序运行的结果:
$ java RunTests Foo
Test public static void Foo.m3() failed: java.lang.RuntimeException: Boom
Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash
Passed: 2, Failed 2
虽然这个测试工具只是一个玩具,但他显示了注释的强大的功能。
来源:http://keriny.iteye.com/blog/842437
分享到:
相关推荐
java @interface 注解详解及实例 Java 中的注解(Annotation)是从 Java 5 开始引入的一种特殊类型的接口,它可以在编译时、类加载时或运行时被读取,并且可以被用来生成描述信息、强制编译检查、.runtime ...
Java注释的引入源于JSR175,这是一个元数据设施,目的是允许类、接口、字段和方法被标记以表明特定属性。元数据是在实际数据之上附加的信息,比如在Java中,`final`关键字就是一个元数据,它表明类不能被继承。通过...
Java 注释编码的知识点涵盖了Java注解(Annotations)的基本概念、语法、使用场景以及与Java SE 8的变化。注解是Java SE 5引入的一个特性,用于为Java代码提供元数据。这些元数据可以被编译器读取,也可以用于运行时...
当子类的方法声明使用此注释时,编译器将检查是否有对应的超类方法可以重写,如果没有,则会产生编译错误。 ##### 2.3 `@Deprecated`注释 `@Deprecated`注释用于标记那些不推荐使用的方法或类,表明它们可能在未来...
为了增强代码的可读性和避免误用,Java允许通过`ElementType`枚举来限制注释的适用范围,如仅限于方法、字段、类型等。例如,可以规定`@Greeting`只能应用于方法上: ```java @Target(ElementType.METHOD) public @...
### JDK注释详解:深入理解Java中的注解 在Java开发中,注解(Annotation)是一种重要的元数据机制,用于向编译器、工具或框架提供额外的信息,从而增强代码的功能性和可读性。本文将从JDK源注释出发,深入解析三种...
Java的反射API允许在运行时检查类、接口、字段和方法的元数据,包括它们的注解。通过`java.lang.reflect.AnnotatedElement`接口,可以获取关于注解的信息。 ### 6. 自定义注解的源代码分析 创建自定义注解通常涉及...
在Java中,你可以通过`@interface`关键字来定义一个注解。注解包含元素(也称为成员),这些元素可以有默认值,也可以接受参数。例如,我们可以定义一个名为`@GenerateTable`的注解,它可能包含`tableName`和`...
下面我们将详细探讨Java2Pas的工作原理、使用方法以及其在IT领域的应用。 首先,Java和Delphi是两种不同的编程语言,它们有着不同的语法结构和编程模型。Java是一种面向对象的语言,由Sun Microsystems(现已被...
- **声明注解**:使用 `@interface` 关键字来声明一个注解。 ```java public @interface MyAnnotation { String value() default ""; } ``` - **使用注解**:通过 `@注解名称` 的形式将注解应用到类、方法或...
Java 注解的作用和实现 Java 中的注解(Annotation)是一种元数据,提供了一种灵活的方式来处理代码中的元数据。...通过这个例子,我们可以看到如何定义和使用自己的注解类型,并使用它们来注释 Java 代码。
一、Java注释类型 Java提供了三种主要的注释类型: 1. 单行注释:以`//`开头,用于简单的单行注释。 ```java // 这是一个单行注释,通常用于快速添加临时或简洁的说明 ``` 2. 多行注释:以`/*`开始,以`*/`结束,...
### Java高级知识点:标注(Annotation) #### 一、概述 在Java编程语言中,标注(Annotation)是一项重要的特性,自JDK 5.0引入以来,极大地丰富...理解和掌握标注的使用方法,对于成为一名优秀的Java开发者至关重要。
总结,掌握Java API的使用和编写清晰的注释是成为一名合格的Java程序员,特别是在大数据领域,必不可少的技能。通过熟练应用API,可以有效地利用已有的功能,而恰当的注释则能够提升代码质量,使得团队协作更加高效...
当这个注解应用于控制器方法的参数时,一个拦截器会在执行方法之前解析这个注解,从请求头中提取JWT令牌,验证它,然后从Redis中获取用户信息并将其放入请求域中供后续方法使用。 此外,还可以创建一个限制接口使用...
在给定的压缩包文件中,可能包含了多个Java文件,每个文件展示了如何使用注解来注解类、方法和属性。通过学习和运行这些示例,你可以更深入地理解Java注解的使用方式和它们在实际项目中的应用。对于初学者,这是一个...
遵循Javadoc规范,开发者可以轻松地理解代码功能和使用方法。 1. Javadoc 基本结构与使用: Javadoc注释使用`/**`开始,以`*/`结束,通常用于类、接口、方法和字段的注释。例如,在方法签名前添加Javadoc,以便为...
这篇博客“使用annotation获取实体类注释”主要探讨了如何利用注解来增强代码的可读性和可维护性,同时介绍了如何从实体类中获取已定义的注解信息。以下是关于这个主题的一些关键知识点: 1. **注解定义**:注解以`...