创建自定义注解
- 注解是使用@interface创建的,后跟注解名称,如以下示例所示。
- 注解也可以包含元素。 它们看起来像方法。 例如,在下面的代码中,我们有四个元素。 我们不应该为这些元素提供实现。
- 所有注解都扩展了java.lang.annotation.Annotation接口。 注解不能包含任何extends子句。
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{
int studentAge() default 18;
String studentName();
String stuAddress();
String stuStream() default "CSE";
}
注意:使用注解时,可以跳过创建注解时设置了默认值的所有元素。 例如,如果我将上述注解应用于一个类,则可以这样进行:
@MyCustomAnnotation(
studentName="Chaitanya",
stuAddress="Agra, India"
)
public class MyClass {
...
}
如您所见,我们没有为studentAge和stuStream元素提供任何值,因为设置这些元素的值是可选的(默认值已在注解定义中设置,但是如果您愿意,可以在使用注解时分配新值 就像我们对其他元素所做的一样)。 但是,在使用注解时,我们必须提供其他元素的值(未设置默认值的元素)。
注意:我们还可以在注解中包含数组元素。 这是我们如何使用它们
注解定义:
@interface MyCustomAnnotation {
int count();
String[] books();
}
使用:
@MyCustomAnnotation(
count=3,
books={"C++", "Java"}
)
public class MyClass {
}
让我们再次回到主题:在自定义注解示例中,我们使用了以下四个注解:@Documented,@Target,@Inherited和@Retention。 让我们详细讨论它们。
@Documented
@Documented注解指示使用此注解的元素应由JavaDoc记录。 例如:
java.lang.annotation.Documented
@Documented
public @interface MyCustomAnnotation {
//Annotation body
}
@MyCustomAnnotation
public class MyClass {
//Class body
}
在为类MyClass生成Javadoc时,注解@MyCustomAnnotation将包含在其中。
@Target
它指定了我们可以在哪里使用注解。 例如:在下面的代码中,我们将目标类型定义为METHOD,这意味着下面的注解只能在方法上使用。
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
public @interface MyCustomAnnotation {
}
public class MyClass {
@MyCustomAnnotation
public void myMethod()
{
//Doing something
}
}
注意:
- 1)如果未定义任何目标类型,则意味着可以将注解应用于任何元素。
- 2)除了ElementType.METHOD,注解可以具有以下可能的Target值。
- ElementType.METHOD
- ElementType.PACKAGE
- ElementType.PARAMETER
- ElementType.TYPE
- ElementType.ANNOTATION_TYPE
- ElementType.CONSTRUCTOR
- ElementType.LOCAL_VARIABLE
- ElementType.FIELD
@Inherited
@Inherited注解表示一个类中使用的自定义注解应由其所有子类继承。 例如:
java.lang.annotation.Inherited
@Inherited
public @interface MyCustomAnnotation {
}
@MyCustomAnnotation
public class MyParentClass {
...
}
public class MyChildClass extends MyParentClass {
...
}
在这里,MyParentClass类使用的是@MyCustomAnnotation注解,该注解带有@inherited注解。 这意味着子类MyChildClass继承了@MyCustomAnnotation注解。
@Retention
它指示带有注解类型的注解将保留多长时间。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface MyCustomAnnotation {
}
在这里,我们使用了RetentionPolicy.RUNTIME。 还有两个其他选择。 让我们看看它们是什么意思:
- RetentionPolicy.RUNTIME:注解应该在运行时可用,以便通过Java反射进行检查。
- RetentionPolicy.CLASS:注解将位于.class文件中,但在运行时将不可用。
- RetentionPolicy.SOURCE:注解将在程序的源代码中可用,而不是在.class文件中,也不在运行时可用。