注解注意点:
- 注解只能作用于注解
类型
元素(aanotation type element),包括:基本数据类型(int…)、String、Class、枚举类型、注解类型,及其一维数组。 - 注解定义的语法比较奇怪,这是为了表示其即能当做属性赋值,又能够当做方法调用,表现为:()不是定义方法参数的地方,也不能在括号中定义任何参数
- 注解的省略:
- 数组只有一个元素时,可以省略{}
- 注解有默认参数时,可以省略。
- 只有一个名为value()的注解时,对其赋值时可以省略value,只写常量。
注解步骤:
- 添加元注解:
@Retention(RetentionPolicy.RUNTIME)
必不可少。@Target(value = ElementType.METHOD)
- 判断类中否是存在指定注解:
xxx.isAnnotationPresent()
。配置在谁上,就在谁上获取:Class.getAnnotation(Class)/Field.getAnnotation(Class)/Method.getAnnotation(Class)/Constructor.getAnnotation(Class)
- 获取相应的注解类,然后使用:
getAnnotation
实例
1. 定义注解。
package yyq.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface MethodAnnotation {
String name() default "zhangsan";
int age() default 18;
int[] array();
}
2.使用注解。
package yyq.annotation;
public class Person {
@MethodAnnotation(name = "Person ",age=30,array = {53,77})
public void printName(int N){
for(int i=0;i<N;i++){
System.out.println("my name is zhangsan");
}
}
}
3.解析注解(放在另外一个类中)。
package yyq.annotation;
import java.lang.reflect.Method;
public class TestAnnotation {
public static void main(String[] args){
try{
Class personClass=Class.forName("yyq.annotation.Person");
Method personMethod=personClass.getMethod("printName", int.class);
if(personMethod.isAnnotationPresent(MethodAnnotation.class)){
System.out.println("Persoin类上配置了MethodAnnotation注解");
MethodAnnotation methodAnnotation =personMethod.getAnnotation(MethodAnnotation.class);
System.out.println("name="+ methodAnnotation.name()+", age: "+ methodAnnotation.age()+" ,score:"+ methodAnnotation.array()[0]);
}
}catch (ClassNotFoundException | NoSuchMethodException e){
e.printStackTrace();
}
}
}