使用AOP获得的对象无法获得范型参数的类型

假设有如下代码

import java.lang.reflect.ParameterizedType;

public class Parent<T> {

    public Class<T> getTClass() {
        return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
}
class Child extends Parent<Integer> {

}

getTClass()方法可以获得范型参数T的具体,为了在子类型Child中获得范型参数类型的Class ,可以调用父类Parent的getTClass()方法,采用以下两种调用方法

System.out.println(new Child().getTClass());
System.out.println(Aop.get(Child.class).getTClass());

第1种调用可以准确得到

class java.lang.Integer

第2种调用就有问题了

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

	at Parent.getTClass(Parent.java:6)
	at Child$$EnhancerByCGLIB$$f536583c.CGLIB$getTClass$0(<generated>)
	at Child$$EnhancerByCGLIB$$f536583c$$FastClassByCGLIB$$c7f645ef.invoke(<generated>)
	at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:84)
	at com.jfinal.aop.Callback.intercept(Callback.java:96)
	at Child$$EnhancerByCGLIB$$f536583c.getTClass(<generated>)

不知道是什么原因造成的。使用JFinal 3.5

评论区

JFinal

2018-10-25 16:55

你用于参数的那个对象被增强过,所以参考 AopFactory.getUsefulClass(...) 这个方法,再获取一次真实的 class 再传入就可以了

在 getTClass 这个方法中参考AopFactory.getUsefulClass(...) 这个方法,获取一次 getSuperclass() 即可,注意要先判断一下,不是所有都要 getSuperclass()

没牙的小朋友

2018-10-26 08:40

@JFinal 解决了。AopFactory.getUsefulClass(...)这个方法是protected的,之后的版本有没有考虑放成public作为工具方法。不然还得自己复制下代码。

热门反馈

扫码入社