当前位置:编程学习 > JAVA >>

Java程序工具之发射机制类信息打印器(Java版本)

[java]
/**
 * @author Sking
 * 使用反射机制打印类信息
 */ 
package component.ReadAPI; 
import java.lang.reflect.*; 
import java.util.*; 
 
public class GenericReflectionTest 

   public static void main(String[] args) 
   { 
      String name; 
      if (args.length > 0)  
         name = args[0]; 
      else  
      { 
         Scanner in = new Scanner(System.in); 
         System.out.println("Enter class name (e.g. java.util.Date): "); 
         name = in.next();//从控制台读取指定类 
      } 
      try 
      {   
         Class<?> cl = Class.forName(name);//返回指定类对应的Class对象 
         printClass(cl);//打印类声明 
         for (Method m : cl.getDeclaredMethods())//打印类的所有方法 
            printMethod(m); 
      } 
      catch (ClassNotFoundException e) 
      { 
         e.printStackTrace(); 
      } 
   } 
 
   public static void printClass(Class<?> cl) 
   { 
      System.out.print(cl);//打印类名,格式为:class 类的完全限定名 
      printTypes(cl.getTypeParameters(), "<", ", ", ">");//类的类型参数列表 
      Type sc = cl.getGenericSuperclass(); //返回直接父类的类型 
      if (sc != null)  
      { 
         System.out.print(" extends "); 
         printType(sc); 
      } 
      printTypes(cl.getGenericInte易做图ces(), " implements ", ", ", ""); 
      System.out.println(); 
   } 
 
   public static void printMethod(Method m) 
   { 
      String name = m.getName();//方法名 
    //打印访问修饰符标志的字符串 
      System.out.print(Modifier.toString(m.getModifiers())); 
      System.out.print(" "); 
      printTypes(m.getTypeParameters(), "<", ", ", "> ");//方法类型参数列表 
      printType(m.getGenericReturnType());//打印返回类型 
      System.out.print(" "); 
      System.out.print(name);//打印方法名 
      System.out.print("("); 
      printTypes(m.getGenericParameterTypes(), "", ", ", "");//形参类型列表 
      System.out.println(")"); 
   } 
  
   /**
    * 按照指定格式打印数组参数指定的类型列表
    * @param types 类型数组
    * @param pre 格式前缀
    * @param sep 类型之间的分隔符
    * @param suf 格式后缀
    */ 
   public static void printTypes(Type[] types, String pre, String sep,  
                  String suf) 
   { 
      if (types.length > 0) System.out.print(pre);//打印前缀 
      for (int i = 0; i < types.length; i++) 
      { 
         if (i > 0) System.out.print(sep); 
         printType(types[i]); 
      } 
      if (types.length > 0) System.out.print(suf); 
   } 
 
   public static void printType(Type type) 
   { 
      if (type instanceof Class) //对象类型 
      { 
         Class<?> t = (Class<?>) type; 
         System.out.print(t.getName()); 
      } 
      else if (type instanceof TypeVariable)//类型变量 
      { 
         TypeVariable<?> t = (TypeVariable<?>) type; 
         System.out.print(t.getName()); 
         printTypes(t.getBounds(), " extends ", " & ", ""); 
      } 
      else if (type instanceof WildcardType)//通配符类型表达式 
      { 
         WildcardType t = (WildcardType) type; 
         System.out.print("?"); 
         printTypes(t.getLowerBounds(), " extends ", " & ", ""); 
         printTypes(t.getUpperBounds(), " super ", " & ", ""); 
      } 
      else if (type instanceof ParameterizedType)//参数化类型 
      { 
         ParameterizedType t = (ParameterizedType) type; 
         Type owner = t.getOwnerType(); 
         if (owner != null) { printType(owner); System.out.print("."); } 
         printType(t.getRawType()); 
         printTypes(t.getActualTypeArguments(), "<", ", ", ">");          
      } 
      else if (type instanceof GenericArrayType)//数组类型 
      { 
         GenericArrayType t = (GenericArrayType) type; 
         System
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,