1,虚拟机中没有泛型,只有普通的类和方法
2,所有的类型参数都用他们的限定类型替换
3,桥方法被合成来保持多态
4,为保证类型安全性,必要时插入强制类型转换
反射API 与 泛型,Type包含下列子类型
Class类,描述具体类型
TypeVariable接口,描述类型变量(如 T extends Comparable<? super T>)
WildcardType接口,描述通配符 (如 ? super T)
ParameterizedType接口,描述泛型类和接口类型(如:Comparable<? super T>)
GenericArrayType接口,描述泛型数组(如 T[ ])
package reflection;
import java.lang.reflect.*;
import java.util.Arrays;
import java.util.Scanner;
/**
* Created by maoxiao on 14-4-24.
*/
public class GenericReflection {
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 :");
name = "45ft3";
}
try{
Class<?> cl = Class.forName(name);
printClass(cl);
for(Method m:cl.getDeclaredMethods()){
printMethod(m);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
private static void printMethod(Method m) {
String name = m.getName();
System.out.println(Modifier.toString(m.getModifiers()));
System.out.print(" ");
printTypes(m.getTypeParameters(),"<",",",">",true);
printType(m.getGenericReturnType(),false);
System.out.print(" ");
System.out.print(name);
System.out.println("(");
printTypes(m.getGenericParameterTypes(),"",",","",false);
System.out.println(")");
}
private static void printClass(Class<?> cl) {
System.out.println(cl);
printTypes(cl.getTypeParameters(),"<",",",">",true);
Type sc = cl.getGenericSuperclass();
if(sc!=null){
System.out.println(" extends ");
printType(sc,false);
}
printTypes(cl.getGenericInterfaces()," implements ",",","",false);
System.out.println();
}
private static void printTypes(Type[] types, String pre, String sep, String suf, boolean isDefinition) {
if(pre.equals(" extends ") && Arrays.equals(types, new Type[]{Object.class})) return;
if(types.length>0) System.out.println(pre);
for(int i=0;i<types.length;i++){
if(i>0) System.out.println(sep);
printType(types[i], isDefinition);
}
if(types.length>0) System.out.println(suf);
}
private static void printType(Type type, boolean isDefinition) {
if(type instanceof Class){
Class<?> t = (Class<?>) type;
System.out.println(t.getName());
}else if(type instanceof TypeVariable){
TypeVariable<?> t = (TypeVariable<?>) type;
System.out.println(t.getName());
if(isDefinition)
printTypes(t.getBounds()," extends "," & ","",false);
}else if(type instanceof WildcardType){
WildcardType t = (WildcardType)type;
System.out.println("?");
printTypes(t.getUpperBounds()," extends "," & ","",false);
printTypes(t.getLowerBounds()," super "," & ","",false);
}else if( type instanceof ParameterizedType){
ParameterizedType t = (ParameterizedType) type;
Type owner = t.getOwnerType();
if(owner!=null){
printType(owner,false);
System.out.println(".");
}
printType(t.getRawType(), false);
printTypes(t.getActualTypeArguments(),"<",",",">",false);
}else if(type instanceof GenericArrayType){
GenericArrayType t = (GenericArrayType)type;
System.out.println("");
printType(t.getGenericComponentType(),isDefinition);
System.out.println("[]");
}
}
}