```markdown
在 Java 中,注解(Annotation)是一种元数据,用于提供有关代码的额外信息。注解本身并不直接影响代码的执行,但可以通过反射机制在运行时获取和处理。这些注解通常可以附加在类、方法、字段等元素上。
在 Java 注解中,可以为注解的属性指定默认值。当注解属性没有显式赋值时,会使用该默认值。通过为注解属性指定默认值,可以使得注解更加灵活,减少使用时的重复。
Java 注解中的属性是方法,它们可以返回一些基本类型、String
、Class
类型、enum
、注解类型,甚至数组类型。在定义这些属性时,可以通过 default
关键字来指定默认值。
```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyAnnotation { // 定义一个字符串类型的属性,指定默认值为 "Hello" String value() default "Hello";
// 定义一个整数类型的属性,指定默认值为 100
int number() default 100;
// 定义一个布尔类型的属性,指定默认值为 true
boolean active() default true;
} ```
在上面的例子中,我们定义了一个注解 MyAnnotation
,它包含三个属性:
- value
:类型为 String
,默认值为 "Hello"
- number
:类型为 int
,默认值为 100
- active
:类型为 boolean
,默认值为 true
如果在使用注解时没有为这些属性显式指定值,Java 编译器会自动使用它们的默认值。
java
@MyAnnotation
public class MyClass {
// 使用了注解,但没有指定任何值,属性将使用默认值
}
在上述代码中,MyClass
类使用了 @MyAnnotation
注解,但没有指定任何值。因此,value
将默认为 "Hello"
,number
默认为 100
,active
默认为 true
。
如果需要覆盖默认值,可以显式为注解的属性赋值。
java
@MyAnnotation(value = "Goodbye", number = 200, active = false)
public class MyClass {
// 使用了注解,并显式指定了值
}
在这个例子中,value
被指定为 "Goodbye"
,number
被指定为 200
,active
被指定为 false
,这些值会覆盖注解中定义的默认值。
可以通过反射机制获取注解的默认值。例如:
```java import java.lang.annotation.Annotation; import java.lang.reflect.Method;
public class AnnotationTest {
public static void main(String[] args) throws Exception {
Class
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
// 获取注解的属性值
System.out.println("value: " + annotation.value()); // 输出 "Hello"
System.out.println("number: " + annotation.number()); // 输出 100
System.out.println("active: " + annotation.active()); // 输出 true
}
}
} ```
上述代码通过反射获取注解 MyAnnotation
的属性值。由于在 MyClass
类上没有显式指定任何属性值,因此它会使用默认值。
在定义注解时,如果不为某个属性提供默认值,那么该属性在使用注解时必须显式赋值。如果为该属性提供了默认值,则该属性变成了可选的。
java
public @interface MyAnnotation {
String value() default "Hello"; // 可选属性
String name(); // 必须赋值的属性
}
在这个例子中,value
属性有默认值 "Hello"
,可以不指定;而 name
属性没有默认值,因此在使用 @MyAnnotation
注解时必须指定。
java
@MyAnnotation(name = "John")
public class MyClass {
// 在使用时必须为 name 属性赋值
}
default
关键字为注解的属性指定默认值。通过合理使用注解的默认值,可以使代码更加简洁,增强注解的灵活性。 ```