import java.lang.annotation.*;
import java.lang.reflect.*;

public class AnnotationAccess{
  /* 打印类的注解 */
  public static void printClassAnnotations(Class cl){
    if (cl.isAnnotationPresent(AuthorAnnotation.class)) {
      // 获得AuthorAnnotation类型的注解
      AuthorAnnotation aa = (AuthorAnnotation)cl.getAnnotation(AuthorAnnotation.class);
      System.out.println("作者："+aa.name()+","+aa.company()); // 打印作者信息
    }   
  }
  
  /* 打印类的构造方法的注解 */
  public static void printConstructorAnnotations(Class cl){
    System.out.println("------ 构造方法的描述如下 ------");
    
    // 获得所有构造方法
    Constructor[] declaredConstructors = cl.getDeclaredConstructors(); 
    for (int i = 0; i < declaredConstructors.length; i++) {
      Constructor constructor = declaredConstructors[i]; // 遍历构造方法
      // 查看是否具有指定类型的注解
      if (constructor.isAnnotationPresent(ConstructorAnnotation.class)) {
        // 获得ConstructorAnnotation类型的注解
        ConstructorAnnotation ca = (ConstructorAnnotation) constructor
				.getAnnotation(ConstructorAnnotation.class);
        System.out.println(constructor.getName()+":"+ca.value()); // 打印注解信息
      }

      Annotation[][] parameterAnnotations = constructor
  					.getParameterAnnotations(); // 获得参数的注解
      printParameterAnnotations(parameterAnnotations); //打印参数的注解
			
    }
    System.out.println();
  }
  
  /* 打印类的成员变量的注解 */
  public static void printFieldAnnotations(Class cl){
    System.out.println("-------- 成员变量的描述如下 --------");
	Field[] declaredFields = cl.getDeclaredFields(); // 获得所有成员变量
    for (int i = 0; i < declaredFields.length; i++) {
	  Field field = declaredFields[i]; // 遍历成员变量
	  // 查看是否具有CommonAnnotation类型的注解
	  if (field.isAnnotationPresent(CommonAnnotation.class)) {
	    // 获得CommonAnnotation类型的注解
	    CommonAnnotation fa = field.getAnnotation(CommonAnnotation.class);
	    System.out.print("成员变量"+field.getName()+":    " + fa.description()); // 获得成员变量的描述
	    System.out.println("    " + fa.type()); // 获得成员变量的类型
	  }
	}
		
	System.out.println();
  }
  
  /* 打印类的成员方法的注解 */
  public static void printMethodAnnotations(Class cl){
  	System.out.println("-------- 方法的描述如下 --------");
	Method[] methods = cl.getDeclaredMethods(); // 获得所有方法
	for (int i = 0; i < methods.length; i++) {
	  Method method = methods[i]; // 遍历方法
	  // 查看是否具有CommonAnnotation类型的注解
	  if (method.isAnnotationPresent(CommonAnnotation.class)) {
	    // 获得CommonAnnotation类型的注解
	    CommonAnnotation ma = method.getAnnotation(CommonAnnotation.class);
	   System.out.println("成员方法"+method.getName()+":  "+ma.description()); // 获得方法的描述
	   System.out.println("返回类型："+ma.type()); // 获得方法的返回值类型
	  }
	  Annotation[][] parameterAnnotations = method
					.getParameterAnnotations(); // 获得参数的注解
	  //打印参数的注解				
	  printParameterAnnotations(parameterAnnotations );				
	}
  }

  /* 打印方法的参数的注解*/
  public static void printParameterAnnotations(Annotation[][] parameterAnnotations){
    for (int i = 0; i < parameterAnnotations.length; i++) {
      int length = parameterAnnotations[i].length; // 获得指定参数注解的长度
      if (length == 0) // 如果长度为0表示没有为该参数添加注解
        System.out.println("    未添加Annotation的参数");
      else
	 for (int j = 0; j< length; j++){
	   // 获得CommonAnnotation类型的注解
	   CommonAnnotation pa = (CommonAnnotation) parameterAnnotations[i][j];
	   System.out.print("第"+(i+1)+"个参数：    " + pa.description()); // 获得参数的描述
	   System.out.println("    " + pa.type()); // 获得参数的类型
	 }
     }
     
     System.out.println();
  }

  public static void main(String[] args)throws Exception {
    Class personClass= Class.forName("Person"); //获得表示Person类的Class实例
    
    //打印类的注解
    printClassAnnotations(personClass);
    //打印类的构造方法的注解
    printConstructorAnnotations(personClass);
    //打印类的成员变量的注解	
    printFieldAnnotations(personClass);
    //打印类的成员方法的注解	
    printMethodAnnotations(personClass);	
  }
}

/****************************************************
 * 作者：孙卫琴                                     *
 * 来源：<<Java面向对象编程>>                       *
 * 技术支持网址：www.javathinker.net                *
 ***************************************************/
