"关于Java反射的使用方法,特别是获取泛型类信息" 在Java编程中,反射(Reflection)是一项强大的工具,允许程序在运行时检查和修改自身的行为。它通过`java.lang.reflect`包中的类来实现,如`Class`, `Field`, `Method`等。在给定的代码片段中,我们看到一个名为`GenericsUtils`的类,它提供了一个静态方法`getSuperClassGenricType`,用于获取超类中泛型类型的具体参数类。 首先,让我们深入理解Java反射的工作原理: 1. **获取类信息**: 使用`Class`类的静态方法`forName(String className)`可以加载并返回指定类的`Class`对象。在给定的代码中,`getSuperClassGenricType`方法的参数`clazz`就是目标类的`Class`对象,它代表了需要查询的类。 2. **获取超类信息**: 通过`Class`对象的`getGenericSuperclass()`方法,我们可以得到当前类的直接超类的`Type`表示。如果类没有超类或超类不是泛型,返回的是`null`或者`Object.class`。 3. **处理泛型**: 在Java中,泛型信息在编译后会被擦除,但在运行时,我们仍然可以通过`ParameterizedType`接口来获取泛型类型。如果`getGenericSuperclass()`返回的是`ParameterizedType`的实例,说明超类是泛型类。否则,表示超类没有泛型参数,返回`Object.class`作为默认值。 4. **获取泛型参数**: 一旦我们确认超类是泛型的,通过`((ParameterizedType) genType).getActualTypeArguments()`,我们可以获取到所有的泛型参数`Type`对象。这些`Type`对象可能代表`Class`、`WildcardType`或其他类型的`Type`。 5. **索引访问**: 参数`index`用于指定我们要获取的泛型参数的索引。如果索引超出范围,会抛出`RuntimeException`。 6. **转换Type到Class**: 泛型参数可能是`Class`类型,也可能是其他类型的`Type`。如果确保参数是`Class`类型,可以强制转换为`Class`,否则返回`Object.class`。 例如,假设有一个类`BuyerServiceBean`继承自`DaoSupport<Buyer, Contact>`,那么`getSuperClassGenricType(BuyerServiceBean.class, 0)`将返回`Buyer.class`,而`getSuperClassGenricType(BuyerServiceBean.class, 1)`将返回`Contact.class`。 Java反射提供了一种动态访问和修改类、接口、字段和方法的能力,而在处理泛型时,反射能够帮助我们在运行时获取泛型的实际类型,这对于某些动态编程场景尤其有用。然而,反射的使用应谨慎,因为它可能导致安全问题和性能下降,因此通常只在必要时使用。
Java反射获取泛型工具类
Java .
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* 泛型工具类
*/
public class GenericsUtils {
/**
* 通过反射,获得指定类的父类的泛型参数的实际类型. 如BuyerServiceBean extends DaoSupport<Buyer>
*
* @param clazz
* clazz 需要反射的类,该类必须继承范型父类
* @param index
* 泛型参数所在索引,从0开始.
* @return 范型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
* <code>Object.class</code>
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(Class clazz, int index) {
Type genType = clazz.getGenericSuperclass();// 得到泛型父类
// 如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.class
return Object.class;
}
// 返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class, 如BuyerServiceBean extends
// DaoSupport<Buyer,Contact>就返回Buyer和Contact类型
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("你输入的索引"
+ (index < 0 ? "不能小于0" : "超出了参数的总数"));
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
/**
* 通过反射,获得指定类的父类的第一个泛型参数的实际类型. 如BuyerServiceBean extends DaoSupport<Buyer>
*
* @param clazz
* clazz 需要反射的类,该类必须继承泛型父类
* @return 泛型参数的实际类型, 如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回
* <code>Object.class</code>
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(Class clazz) {
return getSuperClassGenricType(clazz, 0);
}
/**
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展