取得泛型T.class的方法

前几天写框架碰到T.class的问题,因为无法在一个类或者方法里得到T.class, 所以必须得靠一个参数把T.class传进去, 今天,想起这个问题,就搜了一下,在网上看到一篇文章(http://www.mscto.com/JavaScript/2009010958837.html),里面说可以得到类级别的T.class。 方法如下:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Java中的泛型采用擦拭法。无法得到自己本身的泛型。而调用getGenericSuperclass()方法得到的是父类的泛型。不过一般也能解决问题。只要知道他的限制就行了,因势利导吧。

如果你想用一个Base类实现一些接口方法(只是实现方法,并没有实现全部方法,也不是实现接口),而且一个子类extends的这个Base类,由于你不会再在子类中实现同样的方法,所以Base类里的方法必须声明为public, 而且不是一般的Base类里可以是protected方法。

还有一个问题,如果你想使用CGLib来做代理的话,可能这种方法不行。因为CGLib是通过扩展和增强原来的类实现代理的,而这里的getClass()得到的很可能是CGLib生成的子类,这样就不能强制转换成ParameterizedType类型。大家在具体使用中注意这一点。

还需要得到方法里的T.Class,而且是静态方法,不知道能不能实现? 后来得到的答案是不能。 正如上面所讲的Java中的泛型采用擦拭法, 而且静态方法是可以被任何地方和其他任何方法调用的,根本就不会有Base类的“泛型T”,也就无法得到T.class。

以前都用JDK1.4, 最近公司才决定放弃1.4,这才开始研究泛型。







你可能感兴趣的:(JavaScript,html,框架)