Reflect工具类(自己写的小玩意,作个纪念)

 

package cn.edu.sdu.tavor;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
/**
 * 解析类结构
 * @author tavor
 * @version 1.0
 */
public class MyReflectTools
{
 private static int dimention = 0;
 private HashMap classNames = new HashMap();
 private static ArrayList importKeyWord = new ArrayList();
 private static final String [] keys = {"int","float","void","short","double","char","boolean", "byte", "long"};
 private ArrayList outList = new ArrayList();
 private static final String langPackage = "java.lang.";
 private static final String objectClass = "java.lang.Object";
 private MyReflectTools()
 {
 }
 public String toString()
 {
  Iterator iterator = outList.iterator();
  StringBuffer buff = new StringBuffer();
  while(iterator.hasNext())
  {
   buff.append(iterator.next());
   buff.append("/n");
  }
  return buff.toString();
 }
 public static String reflect(String className)
 {
  try
  {
   Class c = Class.forName(className);
   return reflect(c);
  }
  catch (Throwable e)
  {
   System.err.println(e);
   return null;
  }
 }
 public static String reflect(Class c)
 {
  checkImportKeyWord();
  if(c != null)
  {
   MyReflectTools tool = new MyReflectTools();
   tool.beginReflect(c);
   return tool.toString();
  }
  return null;
 }
 public static void printClass(String className)
 {
  System.out.print(reflect(className));
 }
 public static void printClass(Class c)
 {
  System.out.print(reflect(c));
 }
 private static void checkImportKeyWord()
 {
  if(importKeyWord.size() == 0)
  {
   for(int i=0; i<keys.length; i++)
   {
    importKeyWord.add(keys[i]);
   }
  }
 }
 private String getParentInter(Class c)
 {
  StringBuffer interStr = new StringBuffer();
  Class[] inters = c.getInterfaces();
  if(inters.length > 0)
  {
   interStr.append(" implements ");
  }
  for(int i=0; i<inters.length; i++)
  {
   putClassName(inters[i]);
   interStr.append(getShortName(inters[i]));
   if(i != inters.length-1)
   {
    interStr.append(",");
   }
  }
  return interStr.toString();
 }
 private void beginReflect(Class c)
 {
  Package p = c.getPackage();
  if(p != null)
  {
   outList.add("package "+p.getName()+";");
  }
  StringBuffer temp = new StringBuffer();
  temp.append(getModiferStr(c.getModifiers()));
  temp.append("class ");
  temp.append(getShortName(c));
  temp.append(getSuperClassName(c));
  temp.append(getParentInter(c));
  outList.add(temp.toString());
  outList.add("{");
  reflectClass(c);
  outList.add("}");
  Iterator iter = classNames.keySet().iterator();
  while(iter.hasNext())
  {
   Object t =  iter.next();
   if(!importKeyWord.contains(t))
   {
    if(!checkLangPackage(t.toString()))
    {
     outList.add("import "+t.toString()+";");
    }
   }
  }
 }
 private String getSuperClassName(Class c)
 {
  if(c != null)
  {
   Class temp = c.getSuperclass();
   putClassName(temp);
   if(!temp.getName().equalsIgnoreCase(objectClass))
   {
    return " extends "+getShortName(temp);
   }
  }
  return "";
 }
 private void reflectClass(Class c)
 {
     dimention++;
     String spaceStr = getCountSpaceStr(dimention);
  Class []classes = c.getDeclaredClasses();
  StringBuffer temp = new StringBuffer();
        for(int v=0; v<classes.length; v++)
        {
         temp.append(spaceStr);
         temp.append(getModiferStr(classes[v].getModifiers()));
         if(!classes[v].isInterface())
         {
          temp.append("class/t");
         }
         temp.append(classes[v].getName().substring(c.getName().length()+1));
         temp.append(getSuperClassName(classes[v]));
      temp.append(getParentInter(classes[v]));
         outList.add(temp.toString());
         temp = new StringBuffer();
         temp.append(spaceStr);
         temp.append("{");
         outList.add(temp.toString());
         reflectClass(classes[v]);
         temp = new StringBuffer();
         temp.append(spaceStr);
         temp.append("}");
         outList.add(temp.toString());
         temp = new StringBuffer();
        }
       
        Constructor[] cons = c.getDeclaredConstructors();
        if(cons.length >0) outList.add(spaceStr+"//ConStructors");
        for(int i=0; i<cons.length; i++)
        {
         temp.append(spaceStr);
         temp.append(getModiferStr(cons[i].getModifiers()));
         temp.append(cons[i].getName().substring(cons[i].getName().lastIndexOf('.')+1));
         temp.append("(");
         temp.append(reflectMethodParas(cons[i].getParameterTypes()));
         outList.add(temp.toString());
         temp = new StringBuffer();
        }
        Field [] fields = c.getDeclaredFields();
        if(fields.length >0) outList.add(spaceStr+"//Fields");
        for(int i=0;i<fields.length;i++)
        {
         temp.append(spaceStr);
         temp.append(getModiferStr(fields[i].getModifiers()));
         temp.append(reflectType(fields[i].getType()));
         temp.append("/t");
         temp.append(fields[i].getName());
         temp.append(";");
         outList.add(temp.toString());
         temp = new StringBuffer();
        }
        Method m[] = c.getDeclaredMethods();
        if(m.length >0) outList.add(spaceStr+"//Methods");
        for (int i = 0; i < m.length; i++)
        {
         temp.append(spaceStr);
         temp.append(getModiferStr(m[i].getModifiers()));
         temp.append(reflectType(m[i].getReturnType()));
         temp.append("/t");
         temp.append(m[i].getName());
         temp.append("(");
         temp.append(reflectMethodParas(m[i].getParameterTypes()));
         outList.add(temp.toString());
         temp = new StringBuffer();
        }
     dimention--;
 }
 private String reflectMethodParas(Class[] paras)
 {
  StringBuffer retStr = new StringBuffer();
         if(paras!=null && paras.length>0)
         {
          for(int t=0; t<paras.length;t++)
          {
           retStr.append(reflectType(paras[t]));
           if(t<paras.length -1)
           {
            retStr.append(", ");
           }
          }
         }
         retStr.append(");");
         return retStr.toString();
 }
 private String reflectType(Class cl)
 {
  StringBuffer retStr = new StringBuffer();
  if(cl.isArray())
  {
   int dimensions = 0;
   while (cl.isArray())
   {
    dimensions++;
    cl = cl.getComponentType();
   }
   retStr.append(getShortName(cl));
   putClassName(cl);
   for (int j = 0; j < dimensions; j++)
   {
    retStr.append("[]");
   }
  }
  else
  {
   retStr.append(getShortName(cl));
   putClassName(cl);
  }
  return retStr.toString();
 }
 private void putClassName(Class c)
 {
  if(c != null)
  {
   String name = c.getName();
   classNames.put(name, getShortName(c));
  }
 }
 private String getShortName(Class c)
 {
  String retStr = null;
  if(c != null)
  {
   String name = c.getName();
   if(!classNames.containsKey(c.getName()))
   {
    String shortName = name.substring(name.lastIndexOf('.')+1);
    if(classNames.containsValue(shortName))
    {
     retStr = name;
    }
    else
    {
     retStr = shortName;
    }
   }
   else
   {
    retStr = classNames.get(name).toString();
   }
  }
  return retStr;
 }
 private static String getCountSpaceStr(int count)
 {
  StringBuffer bufferStr = new StringBuffer(count);
  for(int i=0; i<count; i++)
  {
   bufferStr.append("/t");
  }
  return bufferStr.toString();
 }
 private static String getModiferStr(int modifiers)
 {
  String strRe = Modifier.toString(modifiers);
  if(strRe != "")
  {
   strRe+="/t";
  }
  return strRe;
 }
 private static boolean checkLangPackage(String path)
 {
  if(path != null && path.startsWith(langPackage))
  {
   if(path.indexOf('.',langPackage.length()) < 0)
   {
    return true;
   }
  }
  return false;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值