Java反射获取方法泛型信息以及注解信息

1. 通过反射获取泛型信息

  • 定义两个方法
    • 一个方法有泛型形参,没有返回值test01
    • 一个方法没有形参,有泛型返回值test02
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;
}
  • 1、获取方法的泛型形参信息以及真实参数类型
    通过反射先获取类class对象,然后获取类对象的指定方法,
//获取方法的形参的泛型类型
Method method = 获取泛型信息.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);
        }
    }
}
  • 输出结果
    在这里插入图片描述
  • 2、获取方法的泛型返回值信息以及真实饭返回值参数信息
Method re = 获取泛型信息.class.getMethod("test02");
//获取泛型返回值类型
Type genericReturnType = re.getGenericReturnType();
System.out.println(genericReturnType);
//泛型返回值类型是否属于参数化类型
if (genericReturnType instanceof ParameterizedType) {
    //获取泛型返回值类型的实际类型参数
    Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
    //遍历实际参数类型
    for (Type actualTypeArgument : actualTypeArguments) {
        System.out.println(actualTypeArgument);
    }
}
  • 输出结果
    在这里插入图片描述

2. 通过反射获取注解信息

  • 自定义两个注解
//类名的注解
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@interface Table {
    String value();//表名
}

//属性的注解
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
@interface FieldValue {
    String columnName();//字段名
    String type();//字段类型
    int length();//长度
}
  • 通过反射获取注解信息以及注解一些自定义的值
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
    //首先,获取指定类的类class对象
    Class c1 = Class.forName("com.learn.reflection.Student");
    //1.通过反射获取类注解的全部注解
    Annotation[] annotations = c1.getAnnotations();
    for (Annotation annotation : annotations) {
        System.out.println(annotation);
    }
    //2.获取类指定注解的value的值
    Table table = (Table) c1.getAnnotation(Table.class);
    String value = table.value();//获取到注解的value值
    System.out.println(value);

    //3.获取类指定属性的注解
    //3.1获取类对象的指定属性
    Field f = c1.getDeclaredField("name");
    //3.2获取属性的指定注解信息
    FieldValue annotation = f.getAnnotation(FieldValue.class);
    //3.3获取指定属性定义的有哪些值
    System.out.println(annotation.columnName());
    System.out.println(annotation.type());
    System.out.println(annotation.length());
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值