获取泛型信息及获取注解信息
一、获取泛型信息
反射操作泛型:
➢Java采用泛型擦除的机制来引入泛型, Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题, 但是,一旦编译完成,所有和泛型有关的类型全部擦除
➢为了通过反射操作这些类型, Java新增了ParameterizedType , GenericArrayType ,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型.
➢ParameterizedType :表示一种参数化类型,比如Collection<String>
➢GenericArrayType :表示一种元素类型是参数化类型或者类型变量的数组类型
➢TypeVariable : 是各种类型变量的公共父接口
➢WildcardType :代表一种通配符类型表达式
//通过反射获取泛型
public class Test11 {public void test01(Map<String,User> map, List<User> list){System.out.println("test01");}public Map<String,User> test02(){System.out.println("test02");return null;}public static void main(String[] args) throws NoSuchMethodException {Method method = Test11.class.getMethod("test01", Map.class, List.class);Type[] genericParameterTypes = method.getGenericParameterTypes();//获得泛型的参数类型for (Type genericParameterType : genericParameterTypes) {System.out.println("#"+genericParameterType);if (genericParameterType instanceof ParameterizedType){//ParameterizedType 参数化类型Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();//getActualTypeArguments()获得真实参数信息for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}method = Test11.class.getMethod("test02",null);Type genericReturnType = method.getGenericReturnType();if (genericReturnType instanceof ParameterizedType){Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {System.out.println(actualTypeArgument);}}}}二、获取注解信息
练习:ORM
◆了解什么是ORM ?
◆Object relationship Mapping -->对象关系映射

◆类和表结构对应◆属性和字段对应◆对象和记录对应,
◆要求:利用注解和反射完成类和表结构的映射关系
//练习反射操作注解
public class Test12 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {Class c1 = Class.forName("com.reflection.Student2");//通过反射获得注解Annotation[] annotations = c1.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);}//获得注解的value的值Tablekuang tablekuang =(Tablekuang) c1.getAnnotation(Tablekuang.class);String value = tablekuang.value();System.out.println(value);//获得类指定的注解Field f = c1.getDeclaredField("id");Fieldkuang annotation = f.getAnnotation(Fieldkuang.class);System.out.println(annotation.columName());System.out.println(annotation.type());System.out.println(annotation.length());}
}
@Tablekuang("db_student")
class Student2{@Fieldkuang(columName = "da_id",type = "int",length = 10)private int id;@Fieldkuang(columName = "da_age",type = "int",length = 10)private int age;@Fieldkuang(columName = "da_name",type = "varchar",length = 3)private String name;public Student2(){}public Student2(int id,int age,String name){this.id = id;this.age = age;this.name = name;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public int getId() {return id;}public int getAge() {return age;}public String getName() {return name;}@Overridepublic String toString() {return "Student2{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}
}//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablekuang{String value();
}//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldkuang{String columName();String type();int length();
}