import javalangannotationAnnotation;
import javalangannotationElementType;
import javalangannotationRetention;
import javalangannotationRetentionPolicy;
import javalangannotationTarget;
import javalangreflectConstructor;
import javalangreflectField;
import javalangreflectMethod;
@Target(ElementTypeCONSTRUCTOR)
// 用于构造方法
@Retention(RetentionPolicyRUNTIME)
// 在运行时加载到Annotation到JVM中(这个一定不能丢掉否则在getAnnotation的时候取不到!!!)
@interface Constructor_Annotation {
String value() default 默认构造方法; // 定义一个具有默认值的String型成员
}
@Target( { ElementTypeFIELD ElementTypeMETHOD ElementTypePARAMETER })
// 用于字段方法参数
@Retention(RetentionPolicyRUNTIME)
// 在运行时加载到Annotation到JVM中
@interface Field_Method_Parameter_Annotation {
Class type() default voidclass; // 定义一个具有默认值的Class型成员
String describ(); // 定义一个没有默认值的String成员
}
public class AnnotationTest {
@Field_Method_Parameter_Annotation(describ = 字段编号 type = intclass)
// 注释字段
int id;
@Field_Method_Parameter_Annotation(describ = 字段姓名 type = Stringclass)
// 注释字段
String name;
@Constructor_Annotation()
// 采用默认构造方法
public AnnotationTest() {
}
@Constructor_Annotation(立即初始化构造方法)
// 注释构造方法
public AnnotationTest(
// 注释构造方法参数
@Field_Method_Parameter_Annotation(describ = 编号 type = intclass) int id @Field_Method_Parameter_Annotation(describ = 姓名 type = Stringclass) String name) {
thisid = id;
thisname = name;
}
@Field_Method_Parameter_Annotation(describ = 获得编号 type = intclass)
public int getId() {
return id;
}
@Field_Method_Parameter_Annotation(describ = 设置编号)
// 成员type采用默认注释方法
public void setId(
// 注释参数
@Field_Method_Parameter_Annotation(describ = 设置编号 type = intclass) int id) {
thisid = id;
}
@Field_Method_Parameter_Annotation(describ = 获得姓名 type = Stringclass)
public String getName() {
return name;
}
@Field_Method_Parameter_Annotation(describ = 设置姓名)
public void setName(@Field_Method_Parameter_Annotation(describ = 姓名 type = Stringclass) String name) {
thisname = name;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Autogenerated method stub
// 构造方法
Constructor[] declaredConstructor = AnnotationTestclassgetDeclaredConstructors(); // 获得所有的构造方法
for (int i = ; i < declaredConstructorlength; i++) {
Constructor constructor = declaredConstructor[i]; // 遍历构造方法
if (constructorisAnnotationPresent(Constructor_Annotationclass)) // 查看是否指定类型的注释
{
Constructor_Annotation ca = (Constructor_Annotation) constructorgetAnnotation(Constructor_Annotationclass);
Systemoutprintln(cavalue()=: + cavalue());
}
Annotation[][] parameterAnnotations = constructorgetParameterAnnotations();// 获得参数注释
for (int j = ; j < parameterAnnotationslength; j++) {
int length = parameterAnnotations[j]length;
if (length == ) // 如果为则表示没有为该参数添加注释
{
Systemoutprintln(没有为该参数添加注释);
} else {
for (int k = ; k < length; k++) {
// 获得参数注释
Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
Systemoutprint( + padescrib()); // 参数描述
Systemoutprintln( + patype()); // 参数类型
}
}
}
Systemoutprintln(****************);
}
// 字段
Systemoutprintln(********字段的Annotation*************);
Field[] declaredFields = AnnotationTestclassgetDeclaredFields(); // 获得所有的字段
for (int i = ; i < declaredFieldslength; i++) {
Field field = declaredFields[i];
// 查看是否具有指定类型的注释
if (fieldisAnnotationPresent(Field_Method_Parameter_Annotationclass)) {
Field_Method_Parameter_Annotation fa = (Field_Method_Parameter_Annotation) fieldgetAnnotation(Field_Method_Parameter_Annotationclass);
Systemoutprint( + fadescrib()); // 获得字段描述
Systemoutprintln( + fatype()); // 获得字段类型
}
}
// 方法
Systemoutprintln(********方法的Annotation*************);
Method[] methods = AnnotationTestclassgetDeclaredMethods(); // 获得所有的方法
for (int i = ; i < methodslength; i++) {
Method method = methods[i];
// 查看是否指定注释
if (methodisAnnotationPresent(Field_Method_Parameter_Annotationclass))
{
Field_Method_Parameter_Annotation ma = (Field_Method_Parameter_Annotation) methodgetAnnotation(Field_Method_Parameter_Annotationclass);
Systemoutprint( + madescrib()); // 获得方法描述
Systemoutprintln( + matype()); // 获得方法类型
}
Annotation[][] parameterAnnotations = methodgetParameterAnnotations(); // 获得所有参数
for (int j = ; j < parameterAnnotationslength; j++) {
int length = parameterAnnotations[j]length;
if (length == ) {
Systemoutprintln(没有添加Annotation参数);
} else {
for (int k = ; k < length; k++) {
// 获得指定的注释
Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
Systemoutprint( + padescrib()); // 获得参数描述
Systemoutprintln( + patype()); // 获得参数类型
}
}
}
Systemoutprintln(********************);
}
}
}