假设有如下代码
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
在 getTClass 这个方法中参考AopFactory.getUsefulClass(...) 这个方法,获取一次 getSuperclass() 即可,注意要先判断一下,不是所有都要 getSuperclass()