一开始项目是报这样的错:
...
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中有哈,一般当我想用反射获取某个类、方法的泛型的时候,就能见到)