java.lang.IllegalStateException: Expected raw type form of 业务类

一开始项目是报这样的错:

...
Caused by: java.lang.IllegalStateException: Expected raw type form of xxxxx业务类
at org.aspectj.weaver.reflect.JavaLangTypeToResolvedTypeConverter.fromType(JavaLangTypeToResolvedTypeConverter.java:71)
...

发现报错的代码是在aspectjweaver 1.8.10这个包里

于是观察业务代码以后,发现是在获取业务类中,一个方法的返回值类型的时候报错了,仔细看了这个方法与其他方法有什么不一样,发现这个方法的返回值是一个内部类,且它的外部类是带泛型的,于是自己写了一个Demo:

其中getSon方法的返回值是Father<R,T>的内部类,且Father带泛型:
在这里插入图片描述

package com.yth;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.reflect.JavaLangTypeToResolvedTypeConverter;
import org.aspectj.weaver.reflect.ReflectionWorld;

/**
 * @author yth
 * @date 2021/12/23
 */
public class SingleTest {
    public static class FX{

    }
    public abstract static class Father<R,T> {
        public abstract Class<R> getKeyClass();
        public abstract T getT();
        public Son getSon() {
            return null;
        }

        protected class Son {

        }
    }

    public static class Father2 extends Father<String,FX> {
        @Override
        public Class<String> getKeyClass() {
            return String.class;
        }

        @Override
        public FX getT() {
            return new FX();
        }

        @Override
        public Son getSon() {
            return new Son();
        }
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Father2 test = new Father2();

        Method getSonMethod = test.getClass().getMethod("getSon");
        Type type = getSonMethod.getGenericReturnType();
        ParameterizedType parameterizedType = (ParameterizedType) type;
        Type rawType = parameterizedType.getRawType();
        Class clazz = (Class) rawType;
        String name = clazz.getName();
        System.out.println(name);
        ReflectionWorld reflectionWorld = new ReflectionWorld(test.getClass().getClassLoader());
        JavaLangTypeToResolvedTypeConverter javaLangTypeToResolvedTypeConverter
            = new JavaLangTypeToResolvedTypeConverter(reflectionWorld);
        javaLangTypeToResolvedTypeConverter.fromType(type);
        System.out.println("ok");
    }
}

运行上面这段代码,你用1.8.10会报错:

 <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.10</version>
</dependency>

用1.8.13版本就好了,这里就不演示Demo的运行情况了,后来看了一下1.8.13的源码,刚好解决了这个问题:
在这里插入图片描述
大概是说之前 参数化类型内部类的情况 没有考虑到。(至于什么是参数化类型,应该指的就是ParameterizedType这个类,上面Demo中有哈,一般当我想用反射获取某个类、方法的泛型的时候,就能见到)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

犬豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值