记录一次反射的使用,第一次真正运用到实际工作中,发现反射是真的强大!

写了一个通用类,主要是便于和 db 的交互操作,使用到了泛型 T 对象,但是有一步需要获取该对象的属性 id 值(前提是所有赋值给 T 对象的对象自己都有一个相同类型的 id),再做一点逻辑处理,如果是具体对象来调用这个泛型,则可以正常 getId() 得到该对象的属性值,但是对于如果是泛型方法里面要通过 T 这个泛型对象来 getId() 出 id 的值,正常是无法获取到的,解决方法有两种:

(1)给 T 对象继承一个统一的父类,在父类里面定义一个 id 属性,这样 T 对象就可以点出 id 的属性值了

(2)通过反射的方式来获取 id 的属性值

这里主要介绍第二种:

public Integer getId(T t){

try{

Class extends Object> tClass = t.getClass();

//得到所有属性

Field[] field = tClass.getDeclaredFields();

/**

* 这里只需要 id 这个属性,所以直接取 field[0] 这

* 一个,如果id不是排在第一位,自己取相应的位置,

* 如果有需要,可以写成for循环,遍历全部属性

*/

//设置可以访问私有变量

field[0].setAccessible(true);

//获取属性的名字

String name = field[0].getName();

//将属性名字的首字母大写

name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());

//整合出 getId() 属性这个方法

Method m = tClass.getMethod("get"+name);

//调用这个整合出来的get方法,强转成自己需要的类型

Integer id = (Integer)m.invoke(t);

//成功通过 T 泛型对象取到具体对象的 id !

return id;

}catch(Exception e){

log.info("没有这个属性");

return null;

}

}

如果需要获取所有的属性,并且想写的更灵活,可以再获取一个属性的类型,然后写一个 for 循环,在 for 循环里面对每个属性再写一些 if 判断,对应是什么类型,自己强转成对应的类型:

for(int i=0;i

// 获取属性类型

String type = field[i].getGenericType().toString();

if(type.equals("class java.lang.String")){

String value = (String)m.invoke(t);

}

if(type.equals("class java.lang.Integer")){

Integer value = (Integer)m.invoke(t);

}

if(type.equals("class java.util.Date")){

Date value = (Date)m.invoke(t);

}

}

一开始觉得想从泛型 T 对象中取具体的对象的属性值,感觉有些滑稽,但自己的逻辑处理中如果这一步能够实现,真的可以简化很多东西,然后就是带着这种看似滑稽的想法,尝试着去做做看,没想到真的可以实现!

有些东西真的去做了,才会发现多么神奇!

java 获取泛型的属性_java在泛型类 T 上利用反射取属性值相关推荐

  1. java获取泛型的类型_Java反射获取泛型类型

    public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...

  2. java 获取所有实现类_Java动态获取实现某个接口下所有的实现类对象集合

    Java动态获取实现某个接口下所有的实现类对象集合 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这 ...

  3. java获取实体类对象_java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  4. java 获取泛型的type,如何获取泛型的Type类型

    开发中很多时候都遇到或使用到泛型.例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken. Type:是java里的 java.lang.reflect.Typ ...

  5. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3

    第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...

  6. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  7. java xml中的冒号_Java jdom解析xml文件带冒号的属性

    Java jdom解析xml文件带冒号的属性 如果xml文件解析带了冒号的属性,一般都是要特别处理,这里是命名空间,N年前遇到过一次忘记记录,后来也忘了,这次再记录下. 解决了,记录下,分享给大家,百 ...

  8. Java获取泛型T的类型 T.class

    import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;public class Main{public s ...

  9. java 获取接口的注解_java反射注解妙用-获取所有接口说明

    前言 最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进行了重构.而权限管理需要用到所有的接口配置,包括接口url地址,接口唯一编码等.想要收集所有的接口信息,如果工程接口 ...

最新文章

  1. Server Error in '/' Application. 报错
  2. vue项目中主要文件的加载顺序(index.html、App.vue、main.js)
  3. 酷睿i7cpu适合的linux,CPU性能篇 - Core i7-4770K Linux之旅:有喜有忧_Linux新闻_Linux公社-Linux系统门户网站...
  4. 程序员网上晒出新同事与老同事一起吃饭的照片,太搞笑
  5. Android QA
  6. ArcGIS Engine开发之TocControl
  7. face_recognition 安装报错问题解决
  8. 【水果识别】基于matalb GUI水果分类系统【含Matlab源码 174期】
  9. PowerDesign 初识
  10. linux imx can 测试,在i.MX8QXP的MEK板上进行简单的CAN(FD)测试
  11. Windows 更新 升级 8007003错误 800tb109错误 文件没有正确签名 很难确定你的电脑能否运行win10【解决方法】
  12. 李居明 饿火命(3)
  13. 嵌入式面试经验分享1——应届生
  14. 【日常积累】hr标签的属性及样式
  15. 各个编程语言都有哪些「黑点」?
  16. 学好英语的42个经典要诀
  17. Eclips配置模板消息
  18. ECC的“点加”和“点乘”
  19. Linux中时间戳和时间之间的转换
  20. 计算机组成原理实验:存储器扩展电路(使用译码器)

热门文章

  1. Linux [tar]
  2. 生物信息学算法之Python实现|Rosalind刷题笔记:004 求DNA的反向互补序列
  3. python学习——读取染色体长度(七:for循环对染色体序列进行反向互补)
  4. Android:通过Android.mk追加编译宏开关
  5. 政府对加密数字货币的态度
  6. 计算机网络安全管理的开题报告,计算机网络安全的应用论文开题报告
  7. 解决Apache启动错误Could not reliably determine the server‘s fully
  8. 【转】快捷方式lnk文件格式详解(英文)
  9. 数学建模常见模型总结
  10. 这5个可以提高前端开发效率的 Chrome扩展程序,建议你尝鲜体验下