[转] 范型是这样的-3

 
最后贴一段代码,某高人写的,卡卡 

Java代码  收藏代码
  1. import java.io.IOException;  
  2. import java.io.Serializable;  
  3. import java.io.Writer;  
  4. import java.lang.reflect.GenericArrayType;  
  5. import java.lang.reflect.Method;  
  6. import java.lang.reflect.Modifier;  
  7. import java.lang.reflect.ParameterizedType;  
  8. import java.lang.reflect.Type;  
  9. import java.lang.reflect.TypeVariable;  
  10. import java.lang.reflect.WildcardType;  
  11. import java.util.ArrayList;  
  12. import java.util.List;  
  13.   
  14. /******************************************************************************* 
  15.  *  
  16.  *  
  17.  * @作者:XXX 
  18.  * @日期:2007-3-11 
  19.  * @版权:北京易迈普技术有限公司版权所有 
  20.  ******************************************************************************/  
  21. public class GenericsTypeScanner {  
  22.     private Writer writer;  
  23.   
  24.     public GenericsTypeScanner() {  
  25.   
  26.     }  
  27.   
  28.     /** 
  29.      * scan a generic class,output the originate declaration to the destination 
  30.      * writer。 
  31.      *  
  32.      * @param writer 
  33.      * @param clazz 
  34.      */  
  35.     public void 扫描(Writer writer, Class clazz) {  
  36.         this.writer = writer;  
  37.         try {  
  38.             printClass(clazz);  
  39.   
  40.             for (Method method : clazz.getDeclaredMethods())  
  41.                 printMethod(method);  
  42.         } catch (IOException e) {  
  43.             e.printStackTrace(System.out);  
  44.   
  45.         }  
  46.   
  47.     }  
  48.   
  49.     private void printClass(Class clazz) throws IOException {  
  50.         writer.write(clazz.getName());  
  51.         printTypes(clazz.getTypeParameters(), "</span><span>",  
  52.                 "</span><span class=\"string\">",  
  53.                 "</span><span>, </span><span class=\"string\">");  
  54.   
  55.         // scan the super class  
  56.         Type superClazz = clazz.getGenericSuperclass();  
  57.         if (superClazz != null) {  
  58.             writer.write(" extends ");  
  59.             printType(superClazz);  
  60.         }  
  61.   
  62.         // scan the interfaces  
  63.         printTypes(clazz.getGenericInterfaces(), " implements "",""");  
  64.   
  65.         writer.write("\n");  
  66.     }  
  67.   
  68.     private void printMethod(Method method) throws IOException {  
  69.         String name = method.getName();  
  70.         writer.write(Modifier.toString(method.getModifiers()));  
  71.         writer.write(" ");  
  72.         printTypes(method.getTypeParameters(), "</span><span>",  
  73.                 "</span><span class=\"string\">",  
  74.                 "</span><span>, </span><span class=\"string\">");  
  75.   
  76.         printType(method.getGenericReturnType());  
  77.   
  78.         writer.write(" ");  
  79.         writer.write(name);  
  80.         writer.write("(");  
  81.         printTypes(method.getGenericParameterTypes(), """, """);  
  82.         writer.write(")\n");  
  83.   
  84.     }  
  85.   
  86.     private void printTypes(Type[] types, String prefix, String seperator,  
  87.             String suffix) throws IOException {  
  88.         if (types.length > 0)  
  89.             writer.write(prefix);  
  90.         for (int i = 0; i < types.length; i++) {  
  91.             if (i > 0)  
  92.                 writer.write(seperator);  
  93.             printType(types[i]);  
  94.         }  
  95.         if (types.length > 0)  
  96.             writer.write(suffix);  
  97.     }  
  98.   
  99.     private void printType(Type type) throws IOException {  
  100.         if (type instanceof Class) {  
  101.             Class t = (Class) type;  
  102.             writer.write(t.getName());  
  103.         } else if (type instanceof TypeVariable) {  
  104.             TypeVariable t = (TypeVariable) type;  
  105.             writer.write(t.getName());  
  106.             printTypes(t.getBounds(), " extends "",""");  
  107.         } else if (type instanceof WildcardType) {  
  108.             WildcardType t = (WildcardType) type;  
  109.             writer.write("?");  
  110.             printTypes(t.getLowerBounds(), " extends "" & """);  
  111.             printTypes(t.getUpperBounds(), " super "" & """);  
  112.         } else if (type instanceof ParameterizedType) {  
  113.             ParameterizedType t = (ParameterizedType) type;  
  114.             Type owner = t.getOwnerType();  
  115.             if (owner != null) {  
  116.                 printType(owner);  
  117.                 writer.write(".");  
  118.             }  
  119.             printType(t.getRawType());  
  120.             printTypes(t.getActualTypeArguments(), "</span><span>",  
  121.                     "</span><span class=\"string\">",  
  122.                     "</span><span>, </span><span class=\"string\">");  
  123.         } else if (type instanceof GenericArrayType) {  
  124.             GenericArrayType t = (GenericArrayType) type;  
  125.             printType(t.getGenericComponentType());  
  126.             writer.write("[]");  
  127.         }  
  128.     }  
  129. }  
posted @ 2012-08-12 08:59  书山瞌睡虫  阅读(163)  评论(0编辑  收藏  举报