- import java.lang.annotation.Annotation;
-
import java.lang.annotation.ElementType;
-
import java.lang.annotation.Retention;
-
import java.lang.annotation.RetentionPolicy;
-
import java.lang.annotation.Target;
-
import java.lang.reflect.Constructor;
-
import java.lang.reflect.Field;
-
import java.lang.reflect.Method;
-
-
@Target(ElementType.CONSTRUCTOR)
-
// 用于构造方法
-
@Retention(RetentionPolicy.RUNTIME)
-
// 在运行时加载到Annotation到JVM中(这个一定不能丢掉,否则在getAnnotation的时候取不到!!!)
-
@interface Constructor_Annotation {
-
String value() default "默认构造方法"; // 定义一个具有默认值的String型成员
-
}
-
-
@Target( { ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
-
// 用于字段,方法,参数
-
@Retention(RetentionPolicy.RUNTIME)
-
// 在运行时加载到Annotation到JVM中
-
@interface Field_Method_Parameter_Annotation {
-
Class type() default void.class; // 定义一个具有默认值的Class型成员
-
-
String describ(); // 定义一个没有默认值的String成员
-
}
-
-
public class AnnotationTest {
-
-
@Field_Method_Parameter_Annotation(describ = "字段编号", type = int.class)
-
// 注释字段
-
int id;
-
@Field_Method_Parameter_Annotation(describ = "字段姓名", type = String.class)
-
// 注释字段
-
String name;
-
-
@Constructor_Annotation()
-
// 采用默认构造方法
-
public AnnotationTest() {
-
-
}
-
-
@Constructor_Annotation("立即初始化构造方法.")
-
// 注释构造方法
-
public AnnotationTest(
-
// 注释构造方法参数
-
@Field_Method_Parameter_Annotation(describ = "编号", type = int.class) int id, @Field_Method_Parameter_Annotation(describ = "姓名", type = String.class) String name) {
-
this.id = id;
-
this.name = name;
-
}
-
-
@Field_Method_Parameter_Annotation(describ = "获得编号", type = int.class)
-
public int getId() {
-
return id;
-
}
-
-
@Field_Method_Parameter_Annotation(describ = "设置编号")
-
// 成员type,采用默认注释方法
-
public void setId(
-
// 注释参数
-
@Field_Method_Parameter_Annotation(describ = "设置编号", type = int.class) int id) {
-
this.id = id;
-
}
-
-
@Field_Method_Parameter_Annotation(describ = "获得姓名", type = String.class)
-
public String getName() {
-
return name;
-
}
-
-
@Field_Method_Parameter_Annotation(describ = "设置姓名")
-
public void setName(@Field_Method_Parameter_Annotation(describ = "姓名", type = String.class) String name) {
-
this.name = name;
-
}
-
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
// TODO Auto-generated method stub
-
// 构造方法:
-
Constructor[] declaredConstructor = AnnotationTest.class.getDeclaredConstructors(); // 获得所有的构造方法
-
for (int i = 0; i < declaredConstructor.length; i++) {
-
Constructor constructor = declaredConstructor[i]; // 遍历构造方法
-
if (constructor.isAnnotationPresent(Constructor_Annotation.class)) // 查看是否指定类型的注释
-
{
-
Constructor_Annotation ca = (Constructor_Annotation) constructor.getAnnotation(Constructor_Annotation.class);
-
System.out.println("ca.value()=: " + ca.value());
-
}
-
-
Annotation[][] parameterAnnotations = constructor.getParameterAnnotations();// 获得参数注释
-
for (int j = 0; j < parameterAnnotations.length; j++) {
-
int length = parameterAnnotations[j].length;
-
if (length == 0) // 如果为0,则表示没有为该参数添加注释
-
{
-
System.out.println("没有为该参数添加注释");
-
} else {
-
for (int k = 0; k < length; k++) {
-
// 获得参数注释
-
Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
-
System.out.print(" " + pa.describ()); // 参数描述
-
System.out.println(" " + pa.type()); // 参数类型
-
}
-
}
-
}
-
System.out.println("****************");
-
}
-
-
// 字段:
-
System.out.println("********字段的Annotation*************");
-
Field[] declaredFields = AnnotationTest.class.getDeclaredFields(); // 获得所有的字段
-
for (int i = 0; i < declaredFields.length; i++) {
-
Field field = declaredFields[i];
-
// 查看是否具有指定类型的注释:
-
if (field.isAnnotationPresent(Field_Method_Parameter_Annotation.class)) {
-
Field_Method_Parameter_Annotation fa = (Field_Method_Parameter_Annotation) field.getAnnotation(Field_Method_Parameter_Annotation.class);
-
System.out.print(" " + fa.describ()); // 获得字段描述
-
System.out.println(" " + fa.type()); // 获得字段类型
-
}
-
}
-
-
// 方法
-
System.out.println("********方法的Annotation*************");
-
Method[] methods = AnnotationTest.class.getDeclaredMethods(); // 获得所有的方法
-
for (int i = 0; i < methods.length; i++) {
-
Method method = methods[i];
-
// 查看是否指定注释:
-
if (method.isAnnotationPresent(Field_Method_Parameter_Annotation.class))
-
-
{
-
Field_Method_Parameter_Annotation ma = (Field_Method_Parameter_Annotation) method.getAnnotation(Field_Method_Parameter_Annotation.class);
-
System.out.print(" " + ma.describ()); // 获得方法描述
-
System.out.println(" " + ma.type()); // 获得方法类型
-
}
-
-
Annotation[][] parameterAnnotations = method.getParameterAnnotations(); // 获得所有参数
-
for (int j = 0; j < parameterAnnotations.length; j++) {
-
int length = parameterAnnotations[j].length;
-
if (length == 0) {
-
System.out.println("没有添加Annotation参数");
-
} else {
-
for (int k = 0; k < length; k++) {
-
// 获得指定的注释:
-
Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
-
System.out.print(" " + pa.describ()); // 获得参数描述
-
System.out.println(" " + pa.type()); // 获得参数类型
-
}
-
}
-
}
-
System.out.println("********************");
-
-
}
-
}
-
-
}
阅读(1483) | 评论(0) | 转发(0) |