反射专题5
来源:互联网 发布:在线注音软件 编辑:程序博客网 时间:2024/06/05 10:19
-1-泛型和Class类
从JDK5以后,Java的Class类增加了泛型功能,从而允许使用泛型来限制Class类。如果Class对应的类暂时未知,则使用Class<?>
,通过在反射中使用泛型,可以避免使用泛型生成的对象需要强制类型转换。
public class CrazyitObjectTest{ public static Object getInstance(String clsName) { try { Class cls = Class.forName(clsName); return cls.newInstance(); } catch (Exception e) { e.printStackTrace(); return null; } }}
上面代码将返回一个新的对象,但由于这个对象的类型是Object,因此需要强制类型转换:
Date d = (Date) CrazyitObjectTest.getInstance(“java.util.Date”);
使用泛型之后的效果,不需要类型转换
public class CrazyitObjectTest{ public static <T> T getInstance(Class<T> cls) { try { return cls.newInstance(); } catch (Exception e) { e.printStackTrace(); return null; } }}Date d = CrazyitObjectTest.getInstance(Date.class);Intent intent = CrazyitObjectTest.getInstance(Intent.class);
-2-使用反射来获取泛型消息
获取了成员变量的Field对象后,就可以很容易地获取该成员变量的数据类型,如下:
//获取成员变量f的类型Class<?> a = f.getType();
但这种方式只对普通类型的成员变量有效。如果该成员变量的类型是有泛型类型的类型,如果Map<String , Integer>
类型,则不能准确地得到该成员变量的泛型参数。
通过下面方式来获取该成员变量的泛型类型:
//获取成员变量f的泛型类型
Type gType = f.getGenericType();
然后将Type对象强制类型转换为ParameterizedType对象,ParameterizedType代表被参数化的类型,也就是增加了泛型限制的类型。ParameterizedType类型提供了如下两个方法:
(1)getRawType():返回没有泛型消息的原始类型;
(2)getActualTypeArguments():返回泛型参数的类型。
例子:
public class GenericTest{ private Map<String , Integer> score; public static void showGeneric() throws Exception { Class<GenericTest> clazz = GenericTest.class; Field f = clazz.getDeclaredField("score"); //直接使用getType()取出类型只对普通类型的成员变量有效 Class<?> a = f.getType(); //下面将看到仅输出java.util.Map Log.d("GenericTest" , "score的类型是:" + a); //获取成员变量f的泛型类型 Type gType = f.getGenericType(); //如果gType类型是ParameterizedType对象 if (gType instanceof ParameterizedType) { //强制类型转换 ParameterizedType pType = (ParameterizedType) gType; //获取原始类型 Type rType = pType.getRawType(); Log.d("GenericTest" , "原始类型是:" + rType); Type[] tArgs = pType.getActualTypeArguments(); Log.d("GenericTest" , "泛型消息是:"); for (int i = 0 ; i < tArgs.length ; i++) { Log.d("GenericTest" , "第" + i + "泛型类型是:" + tArgs[i]); } } }}
输出:
score的类型是:interface java.util.Map
原始类型是:interface java.util.Map
泛型消息是:
第0泛型类型是:class java.lang.String
第1泛型类型是:class java.lang.Integer
例子2(将泛型类型转换为Gson解析时需要的Type类型)
public abstract class BaseCallBack<T>{ public Type mType; static Type getSuperclassTypeParameter(Class<?> subClass) { Type superclass = subClass.getGenericSuperclass(); if (superclass instanceof Class) { throw new RuntimeException("Missing type parameter."); } ParameterizedType parameterized = (ParameterizedType) superclass; return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); } public BaseCallBack() { mType = getSuperclassTypeParameter(getClass()); }}
Type是java.lang.reflect包下的一个接口,该接口代表所有类型的公共高级接口,Class是Type接口的实现类。
- 反射专题5
- Java 反射专题
- Java反射专题1
- Java反射专题2
- 反射专题3
- 反射专题4
- 反射面试专题
- Java--Reflect(反射)专题5——方法反射的基本操作
- Java总结——反射专题
- javase 专题 之反射和动态代理
- Javase 专题之 反射和动态代理
- Javase 专题 反射和动态代理 aop
- VC#.NET入门精典------(专题技术理解)反射篇
- Java--Reflect(反射)专题6——通过反射了解集合泛型的本质
- 论语专题5
- HTML 5专题
- HBase专题介绍 5
- HBase专题介绍 5
- shell的一些基本命令(使用的小技巧)
- Ubuntu 16.04(32位)下iTop4412环境搭建+Android4.0.3编译
- 缓存在高并发场景下的常见问题
- 玩玩Linux云主机-连接到远程的服务器上
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”
- 反射专题5
- EL表达式中如何截取字符串
- hdoj-【1021 Fibonacci Again】
- Oracle12c安装后忘记用户名和密码可通过如下方法解决:
- 1. TCP的三次握手和四次挥手
- 修改mysql表的字段为自增长
- [BZOJ3223]文艺平衡树 splay
- 基于Apache Mahout的电影推荐系统
- 字符设备驱动第四课----自动生成设备