首页 > 代码库 > 关于CGLIB动态代理,抽象类获取T Class<T>转型失败的问题
关于CGLIB动态代理,抽象类获取T Class<T>转型失败的问题
网上看到了以下一段
DK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
恰好我因为使用模板代码模式,抽象类算法模板需要使用到具体子类的类型,并且用了final修饰,SPRING 配置了强制使用CGLIB的动态代理.
我把下面一段定义成类属性,一直报转型失败,这时获取的pt 输出是一个 "T" 字符,我猜想,因为是抽象类不能实例化,而且我写了类名,所以只能输出一个T
public abstract class BaseReportService<T extends BaseReport> { ParameterizedType pt = (ParameterizedType)BaseReportService.getClass().getGenericSuperclass(); Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0]; public final void modelMethod(){ } }
改为以下方法,使用this
public abstract class BaseReportService<T extends BaseReport> { public final void modelMethod(){ ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass(); Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0]; } }
这时输出的是NULL,继续猜想,因为是抽象类,根本没有实例,所以NULL,然后只好写到调用的方法里面.(算法模板使用了FINAL 修饰),依然报的是转型失败.
想起网上看得那段话,又猜想,是否用了FINAL,虚拟机无法对此进行优化重排,又或者是动态代理没有办法织入呢?我不知道,反正把FINAL删除了,就正常了
public abstract class BaseReportService<T extends BaseReport> { public void modelMethod(){ ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass(); Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0]; } }
子类
public class SubReportServiceImpl extends BaseReportService<SubReport> implements SubReportService { }
@Controller("/") public class TestController{ @Resource private BaseReportService subReportService; @RequestMapping public @ResponseBody SubReport list(){ return subReportService.moelMethod(); } }
关于CGLIB动态代理,抽象类获取T Class<T>转型失败的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。