@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类
常用注解有:
@Override 表示重写一个方法
@Deprecated 被此注解标记过的方法表示该方法以及过时,不想在被别人使用
@SuppressWarning 压制程序中的警告
@Retention 是使用在注解上面的注解 所以又被叫为元注解,从上图可以看出来@Retention的value(注解中的value可以省略属性名字不写)属性支持一个类型为RetentionPolicy的参数,这个参数为一个枚举类型,一共有三个值
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
SOURCE 表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
CLASS 表示注解信息会保存在class文件中但不会被虚拟机读取在运行的时候 class为默认值;
RUNTIME 表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,因此可以由反射读取他们
@Target也是一个原注解,表示注解使用的位置,支持枚举属性ElementType ,参数如下
public enum ElementType {
//类、接口(包括注释类型)或枚举声明
TYPE,
//字段声明(包括枚举常量)
FIELD,
//方法声明
METHOD,
//形式参数声明
PARAMETER,
//构造函数
CONSTRUCTOR,
//局部变量
LOCAL_VARIABLE,
//注解
ANNOTATION_TYPE,
//包
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
@Documented表示JavaDoc将记录具有类型的注释以及默认的类似工具。此类型应用于注释其批注影响带批注的使用的类型的声明由客户提供的元素。如果类型声明用注释文档中,它的注释成为公共API的一部分注释的元素。
最后一个图片上面没有的@Inherited ,表示该注解可以被继承
使用构造工厂充当注解解析器
Myname.java类
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target({ElementType.LOCAL_VARIABLE,ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Myname {
String value() default "谭静杰" ;
}
User.java类
public class User {
private String name;
private String age;
public String getName() {
return name;
}
@Myname("谭静杰")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
main 方法
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.Month;
public class Damo1 {
public static void main(String[] args) throws NoSuchAlgorithmException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
User user=new User();
Method[] methods = user.getClass().getMethods();
for(Method month:methods){
System.out.println(month);
if(month.isAnnotationPresent(Myname.class)){
Myname annotation = month.getAnnotation(Myname.class);
month.invoke(user, annotation.value());
System.out.println(user);
};
}
}
}
运行截图