通过反射获得泛型的实际类型参数
不知道大家有没有尝试过怎样获得一个泛型的实际类型参数?其实这个功能在hibernate中有广泛的应用,那么具体的操作是怎样的呢?
首先,要想直接通过一个变量拿到泛型类型中的实际参数显然是不可能的,参考hibernate源码,只要把这个变量当作一个方法的参数,再通过反射就可以拿到该泛型类型的实际参数。
public class GenericsTest {
@Test
public void test7(){
try {
//List<Book> list = new ArrayList<Book>();
//加入我现在想拿到上面这个list泛型中的实际类型参数,那么先写一个方法,以之为参数
//下面利用反射拿到list的实际类型参数
Method m = GenericsTest.class.getMethod("test8", List.class);
//获得泛型类型参数
Type[] types = m.getGenericParameterTypes();
//因为只有一个参数,所以我们拿第一个就可以了
ParameterizedType pt = (ParameterizedType) types[0];
//获得原始类型
System.out.println(pt.getRawType());
//获得实际参数类型,实际参数类型也是一个数组,比如Map<String,String>
//这里只有一个参数,我们就不遍历了
System.out.println(pt.getActualTypeArguments()[0]);
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
public void test8(List<Book> list){
}
}
Book.java
package lenve.test;
public class Book {
private int id;
private String name;
private int price;
private String author;
private Detail detail;
private Attribute attribute;
public Attribute getAttribute() {
return attribute;
}
public void setAttribute(Attribute attribute) {
this.attribute = attribute;
}
public Detail getDetail() {
return detail;
}
public void setDetail(Detail detail) {
this.detail = detail;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Book(String name, String author) {
this.name = name;
this.author = author;
}
public Book() {
}
}
输出:
怎么样?拿到实际类型参数了吧!
蓝天为路,阳光满屋。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?