反射操作泛型
- Java 采用泛型擦除的机制来引入泛型 Java中的泛型仅仅是给编译器javac使用的 确保数据的安全性和免去强制类型转换问题 但是 一旦编译完成 所有和泛型有关的类型全部擦除
- 为了通过反射操作这些类型 Java新增了ParameterizedType, GenericArrayType, TypeVariable, WildcardType 集中类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型
- ParameterizedType:表示一种参数化类型 比如 Collection
- GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
- TypeVariable:是各种类型变量的公共接口
- WildcardType:代表一种通配符类型表达式
package com.wu.annotation;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
public class Demo09 {
public void test01(Map<String,Son>map, List<Son> list){
System.out.println("test01");
}
public Map<String,Son> test02(){
System.out.println("test02");
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method method = Demo09.class.getMethod("test01", Map.class, List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
System.out.println("#" + genericParameterType);
if(genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
method = Demo09.class.getMethod("test02", null);
Type genericReturnType = method.getGenericReturnType();
for (Type genericParameterType : genericParameterTypes) {
System.out.println("#" + genericParameterType);
if(genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
}
}
反射操作注解
package com.wu.annotation;
import java.lang.annotation.*;
import java.lang.reflect.Field;
public class Demo10 {
public static void main(String[] args) throws NoSuchFieldException {
Class<Student2> student2Class = Student2.class;
Annotation[] annotations = student2Class.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
Myannotatin01 annotation = (Myannotatin01)student2Class.getAnnotation(Myannotatin01.class);
System.out.println(annotation.value());
Field name = student2Class.getDeclaredField("name");
Myannotatin02 annotation1 = name.getAnnotation(Myannotatin02.class);
System.out.println(annotation1.columnName());
}
}
@Myannotatin01("wuaopan")
class Student2{
@Myannotatin02(columnName = "db_id",type="varchar",length = "10")
private String name;
@Myannotatin02(columnName = "db_sex",type="varchar",length = "10")
private String sex;
@Myannotatin02(columnName = "db_age",type="int",length = "10")
private int age;
public Student2() {
}
public Student2(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student2{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotatin01{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotatin02{
String columnName();
String type();
String length();
}