获取java类中的具体泛型实现类
来源:互联网 发布:淘宝售后服务的重要性 编辑:程序博客网 时间:2024/06/16 22:11
先科普下,泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
那么问题来了,如何通过java反射获取实现类中的具体泛型呢,先来看几段代码:
public class TestFacade extends BaseFacade<PersonVO> { @Override protected CapBaseAppService<PersonVO> getAppService() { return null; } }
public abstract class BaseFacade<T extends BaseVO> { /** 日志记录 */ private static final Logger LOGGER = LoggerFactory.getLogger(BaseFacade.class); protected abstract CapBaseAppService<T> getAppService();}我们如何TestFacade具体泛型实现类,查看jdk Class源码可知Class的getGenericSuperclass方法能返回带泛型的具体Type
/** * Returns the {@code Type} representing the direct superclass of * the entity (class, interface, primitive type or void) represented by * this {@code Class}. * * <p>If the superclass is a parameterized type, the {@code Type} * object returned must accurately reflect the actual type * parameters used in the source code. The parameterized type * representing the superclass is created if it had not been * created before. See the declaration of {@link * java.lang.reflect.ParameterizedType ParameterizedType} for the * semantics of the creation process for parameterized types. If * this {@code Class} represents either the {@code Object} * class, an interface, a primitive type, or void, then null is * returned. If this object represents an array class then the * {@code Class} object representing the {@code Object} class is * returned. * * @throws java.lang.reflect.GenericSignatureFormatError if the generic * class signature does not conform to the format specified in * <cite>The Java™ Virtual Machine Specification</cite> * @throws TypeNotPresentException if the generic superclass * refers to a non-existent type declaration * @throws java.lang.reflect.MalformedParameterizedTypeException if the * generic superclass refers to a parameterized type that cannot be * instantiated for any reason * @return the superclass of the class represented by this object * @since 1.5 */ public Type getGenericSuperclass() { if (getGenericSignature() != null) { // Historical irregularity: // Generic signature marks interfaces with superclass = Object // but this API returns null for interfaces if (isInterface()) return null; return getGenericInfo().getSuperclass(); } else return getSuperclass(); }
再查看JDK源码ParameterizedType接口可知该接口是继承Type接口的,查看源码注释可知该接口中的getActualTypeArguments方法可以返回实际泛型的具体类型数组,
/** * Returns an array of {@code Type} objects representing the actual type * arguments to this type. * * <p>Note that in some cases, the returned array be empty. This can occur * if this type represents a non-parameterized type nested within * a parameterized type. * * @return an array of {@code Type} objects representing the actual type * arguments to this type * @throws TypeNotPresentException if any of the * actual type arguments refers to a non-existent type declaration * @throws MalformedParameterizedTypeException if any of the * actual type parameters refer to a parameterized type that cannot * be instantiated for any reason * @since 1.5 */ Type[] getActualTypeArguments();所以我们找到了方法通过如下实现即可取得泛型实际类型:
public class Demo { /** * @param args * xx */ public static void main(String[] args) { // ParameterizedType type = (ParameterizedType) TestFacade.class.getGenericSuperclass(); Class<?> cls = (Class<?>) type.getActualTypeArguments()[0]; System.out.println("generic type:" + cls); }}
1 0
- 获取java类中的具体泛型实现类
- Java类中的具体集合
- 获取实现泛型接口的具体类的实现的类型
- 如何查看JAVA类库中的类的方法的具体实现代码
- java反射机制之获取子类的具体泛型
- 单例设计模式在java类中的具体应用
- Java集合架构--Set接口的几个具体实现类
- Java中的Switch对整型、字符型、字符串型的具体实现细节
- Java中的Switch对整型、字符型、字符串型的具体实现细节
- String类的具体实现
- java隐藏具体实现
- 获取具体的泛型类型
- 简单获取java类中的获取名
- 获取java类中的路径
- 利用java反射获取泛型类的类型参数具体类对象
- Java中的ClassLoader具体解说
- Java库中的具体集合
- Java库中的具体集合
- java List分组
- javascript(五)之框架
- 287. Find the Duplicate Number
- Oracle调整表空间大小——ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
- 23种设计模式(1):单例模式
- 获取java类中的具体泛型实现类
- vi的常用键盘操作
- memcached常用命令及使用说明
- 导入导出Excel文件
- 跨域之iframe
- python实现find in功能
- 现代软件工程_项目回顾模板
- 自定义UDF
- OpenStack各组件介绍