Java反射的一个小问题
2015-09-11 10:36
489 查看
这几天写代码的时候遇到这么个有关反射的问题
可以通过这个方式来获取泛型中的类型
Type superClass = getClass().getGenericSuperclass();
if(superClass instanceof ParameterizedType) {//判断是否有参数
}
这里使用了Type类以及ParameterizedType这2个接口,
所以接下来可以研究一下这2个接口
首先是Type:Type 是 Java 编程语言中所有类型的公共高级接口。API文档中就是这么介绍的,在我看来这应该是和Class类差不多,
Class 类的实例表示正在运行的 Java 应用程序中的类和接口;而且Class类海实现了Type接口
Type接口有这么几个子接口GenericArrayType, ParameterizedType, TypeVariable, WildcardType
GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。
ParameterizedType 表示参数化类型,如 Collection。参数化类型在反射方法首次需要时创建(在此包中指定)。当创建参数化类型 p 时,p 实例化的一般类型声明会被解析,并且按递归方式创建 p 的所有类型参数。
TypeVariable 是各种类型变量的公共高级接口。类型变量在反射方法首次需要时创建。
WildcardType 表示一个通配符类型表达式,如 ?、? extends Number 或 ? super Integer。
API上只是说了getActualTypeArguments方法返回表示此类型实际类型参数的 Type 对象的数组,但具体是什么样的,都有些什么值,都没有说,
通过实验表明这个返回的Type数组确实是当前的参数,参数个数和数组长度一致,数组的顺序也和参数顺序一致。
可以通过这个方式来获取泛型中的类型
Type superClass = getClass().getGenericSuperclass();
if(superClass instanceof ParameterizedType) {//判断是否有参数
ParameterizedType parameterizedType = (ParameterizedType) superClass; Type [] typeArgs = parameterizedType.getActualTypeArguments(); //getActualTypeArguments方法返回表示此类型实际类型参数的 Type 对象的数组 if(typeArgs != null && typeArgs.length>0) { if(typeArgs[0] instanceof Class) { clazz = (Class<T>) typeArgs[0]; } }
}
这里使用了Type类以及ParameterizedType这2个接口,
所以接下来可以研究一下这2个接口
首先是Type:Type 是 Java 编程语言中所有类型的公共高级接口。API文档中就是这么介绍的,在我看来这应该是和Class类差不多,
Class 类的实例表示正在运行的 Java 应用程序中的类和接口;而且Class类海实现了Type接口
Type接口有这么几个子接口GenericArrayType, ParameterizedType, TypeVariable, WildcardType
GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。
ParameterizedType 表示参数化类型,如 Collection。参数化类型在反射方法首次需要时创建(在此包中指定)。当创建参数化类型 p 时,p 实例化的一般类型声明会被解析,并且按递归方式创建 p 的所有类型参数。
TypeVariable 是各种类型变量的公共高级接口。类型变量在反射方法首次需要时创建。
WildcardType 表示一个通配符类型表达式,如 ?、? extends Number 或 ? super Integer。
API上只是说了getActualTypeArguments方法返回表示此类型实际类型参数的 Type 对象的数组,但具体是什么样的,都有些什么值,都没有说,
通过实验表明这个返回的Type数组确实是当前的参数,参数个数和数组长度一致,数组的顺序也和参数顺序一致。
相关文章推荐
- java堆栈和垃圾回收
- no jacob.dll in java.library.path解决办法
- spring框架的编码过滤器——CharacterEncodingFilter
- java Smack整合Openfire服务器实现IM即时通讯聊天功能
- Eclipse freemark 插件安装
- Java常用的接口、类、方法
- Java实现字符串的反转
- java 方法的执行时间监控 设置超时(Future 接口)
- 几周内搞定Java的10个方法
- java word文档 转 html文件
- java生成不重复随机数
- Eclipse开发环境下Java可视化编程
- 关于java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream解决办法
- 深入理解Java:注解(Annotation)--注解处理器
- 深入理解Java:注解(Annotation)自定义注解入门
- RocketMQ:一个纯java的开源消息中间件--开发测试环境搭建
- 深入理解Java:注解(Annotation)基本概念
- JAVA 多线程,同步机制
- javaScipt类定义和实现
- spring中的二种注入方式设值注入和构造注入简单例子