1. public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName)
  2. {
  3. try {
  4. Object fieldValue = FieldUtils.readField(target, fieldName, true);
  5. return (T)fieldValue;
  6. } catch (IllegalAccessException e) {
  7. log.error("出错:实体类{}没有{}类型的{}属性字段!",target.getClass(),typeName.getSimpleName(),fieldName);
  8. throw new RuntimeException(e);
  9. }
  10. }

用法1:

  1. public Long getLongValue(Object target, String fieldName)
  2. {
  3. return getFieldValue(target,fieldName,Long.class);
  4. }

以此类推,你也可以写出

  1. public LocalDateTime getLocalDateTimeValue(Object target, String fieldName)
  2. {
  3. return getFieldValue(target,fieldName,LocalDateTime.class);
  4. }
  5.  
  6. public String getStringValue(Object target, String fieldName)
  7. {
  8. return getFieldValue(target,fieldName,String.class);
  9. }

笔者的一个用法是在泛型方法中提取实体的属性值,做进一步计算

  1. <R,T> 你的返回类型 processData(String label, String snapshotKey, Class<T> targetClass,
  2. Predicate<? super T> filter, final Function<? super T, ? extends R> mapper)
  3. {
  4. if(filter == null)
  5. {
  6. //如果没有指定过滤表达式,给一个默认值
  7. filter = (T entity)->{
  8. LocalDateTime createTime = cacheService.getFieldValue(entity, "createTime", LocalDateTime.class);
  9. return createTime.getMinute() % 10 == 0
  10. &&createTime.getSecond() ==0;
  11. };
  12. }
  13. Map<String,Object> resultMap = new HashMap<>();
  14. Optional<SnmpNode> node1 = nodeMapping.values().stream().findFirst();
  15. List<T> list = null;
  16. if(node1.isPresent())
  17. {
  18. String ipAddr1 = node1.get().getAddress();
  19. list = cacheService.getCachedList(snapshotKey, ipAddr1, targetClass);
  20. //服务器ip
  21. resultMap.put("legend", nodeMapping.values().stream().map(SnmpNode::getAddress).collect(Collectors.toList()));
  22.  
  23. //批量格式时间MM-dd HH:mm:ss并封送到List
  24. List<String> xAxis = list.stream()
  25. .map(entity->cacheService.getFieldValue(entity,"createTime", LocalDateTime.class))
  26. .filter(
  27. localDateTime -> localDateTime.getMinute()%10==0 && localDateTime.getSecond() == 0
  28. ).map(createTime -> createTime.format(DateTimeFormatter.ofPattern("MM-dd HH:mm"))).collect(Collectors.toList());
  29.  
  30. //筛选后的样本大小
  31. int filteredSize = xAxis.size();
  32.  
  33. //由于图表不能显示太多的数据,太多的就会被隐藏,因此只显示最近的20条数据
  34. xAxis = xAxis.stream().skip(filteredSize>=0?filteredSize-20:filteredSize).collect(Collectors.toList());
  35. resultMap.put("xAxis",xAxis);
  36.  
  37. List<EChartSeries> series = new LinkedList<>();
  38. for(Map.Entry<Long,SnmpNode> entry: nodeMapping.entrySet())
  39. {
  40. SnmpNode node = entry.getValue();
  41.  
  42. String ipAddr = node.getAddress();
  43.  
  44. List<T> traffics = cacheService.getCachedList(snapshotKey, ipAddr, targetClass);
  45.  
  46. List<R> data = traffics.stream()
  47. .filter(filter)
  48. .skip(filteredSize>=0?filteredSize-20:filteredSize)
  49. .map(mapper).collect(Collectors.toList());
  50.  
  51. EChartSeries chartSeries = new EChartSeries.Builder()
  52. .withName(ipAddr)
  53. .withStack(label)
  54. .withType("line")
  55. .withData((LinkedList<String>) new LinkedList<R>(data))
  56. .build();
  57.  
  58. if(!CollectionUtils.isEmpty(data)) {
  59. series.add(chartSeries);
  60. }
  61. }
  62. resultMap.put("series",series);
  63. }
  64. return 你的返回类型;
  65. }
  1. import lombok.Data;
  2. import lombok.NoArgsConstructor;
  3.  
  4. import java.util.LinkedList;
  5.  
  6. /***
  7. * // name:'邮件营销',
  8. * // type:'line',
  9. * // stack: '内存使用率',
  10. * // data:[120, 132, 101, 134, 90, 230, 210]
  11. */
  12. @Data
  13. @NoArgsConstructor
  14. public class EChartSeries {
  15. private String name;
  16. private String type;
  17. private String stack;
  18. private LinkedList<String> data;
  19.  
  20. private EChartSeries(Builder builder) {
  21. setName(builder.name);
  22. setType(builder.type);
  23. setStack(builder.stack);
  24. setData(builder.data);
  25. }
  26.  
  27. public static final class Builder {
  28. private String name;
  29. private String type;
  30. private String stack;
  31. private LinkedList<String> data;
  32.  
  33. public Builder() {
  34. }
  35.  
  36. public Builder(EChartSeries copy) {
  37. this.name = copy.getName();
  38. this.type = copy.getType();
  39. this.stack = copy.getStack();
  40. this.data = copy.getData();
  41. }
  42.  
  43. public Builder withName(String name) {
  44. this.name = name;
  45. return this;
  46. }
  47.  
  48. public Builder withType(String type) {
  49. this.type = type;
  50. return this;
  51. }
  52.  
  53. public Builder withStack(String stack) {
  54. this.stack = stack;
  55. return this;
  56. }
  57.  
  58. public Builder withData(LinkedList<String> data) {
  59. this.data = data;
  60. return this;
  61. }
  62.  
  63. public EChartSeries build() {
  64. return new EChartSeries(this);
  65. }
  66. }
  67. }

用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用的更多相关文章

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

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

  2. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  3. 【转】java遍历实体类的属性和数据类型以及属性值

    和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...

  4. java怎么比较两个实体类的属性值

    分享一下比较两个实体类的工具包 package cn.mollie.utils; import java.beans.Introspector; import java.beans.PropertyD ...

  5. java反射获取和设置实体类的属性值 递归所有父类

    最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...

  6. Spring中使用@Value读取porperties文件中的属性值方法总结及注意事项

    本文为博主原创,转载请注明出处. 此前曾总结过使用工具类读取properties文件中的属性值,有兴趣的可以看一下. 如何快速获取properties中的配置属性值:https://www.cnblo ...

  7. <s:property="a" value=""/>取的<s:debug></s:debug>中的value stack中的属性值

    <s:property="a"  value=""/>取的<s:debug></s:debug>中的value stack中 ...

  8. 将source类中的属性值赋给target类中对应的属性

    /** * 对象的属性值拷贝 * <p> * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样 * <p> * example: * <p ...

  9. 【Python】获取翻页之后的各页面中的属性值。

    如何获取翻页之后的页面中的html标签中的属性值? # coding=utf-8 from selenium import webdriver if __name__=="__main__& ...

随机推荐

  1. zencart设置产品始终免运费sql

    zencart网站后台-Tools(工具)-Install SQL Patches(安装SQL脚本): 运行以下相应sql语句,即可实现产品始终免运费. zencart设置所有产品始终免运费: '; ...

  2. Dijkstra 优先队列优化

    #include <iostream> #include <queue> #include <vector> using namespace std; ; stru ...

  3. Python学习 第一天(一)初始python

    1.python的前世今生 想要充分的了解一个人,无外乎首先充分了解他的过去和现在:咱们学习语言也是一样的套路 1.1 python的历史 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈp ...

  4. Cobbler——无人值守安装多种版本多种配置操作系统

    Cobbler Web 图形界面也能实现类似的导入功能,可以参见下一节举了一个Cobbler Web的用法: cobbler 添加网络同步仓库(Reposync用法)

  5. JavaScript中foreach、map函数

    语法:forEach和map都支持2个参数:一个是回调函数(item,index,input)和上下文: •forEach:用来遍历数组中的每一项:这个方法执行是没有返回值的,对原来数组也没有影响: ...

  6. Android 中WebView中video视频自动播放

    转载于https://juejin.im/post/5d5ac7eb51882562744fae37 如果有使用过Android的WebView 播放视频的伙伴们一定会发现, 在点开视频网页的时候并没 ...

  7. BZOJ 2809: [Apio2012]dispatching(可并堆 左偏树板题)

    这道题只要读懂题目一切好说. 给出nnn个点的一棵树,每一个点有一个费用vvv和一个领导力aaa,给出费用上限mmm.求下面这个式子的最大值ax∗∣S∣ ( S⊂x的子树, ∑iv[i]≤m )\la ...

  8. python中的list,tuple,dict,set简介---陈雨童

    变量和对象 变量把对象和自己连接起来(指针连接对象空间),引用建立了变量和对象之间的映射关系,这就是引用.引用完成,就实现了赋值.变量通过对象的内存地址指向对象,类似于软链接 将变量a赋值给变量b,其 ...

  9. django环境配置(基于命令行安装)

    一.django简介 Python服务端开发框架,Django是一个开放源代码的Web应用框架,由Python写成,Django采用了MVC的软件设计模式,即模型M,视图V和控制器C 二.安装配置dj ...

  10. FZU - 2218 Simple String Problem 状压dp

    FZU - 2218Simple String Problem 题目大意:给一个长度为n含有k个不同字母的串,从中挑选出两个连续的子串,要求两个子串中含有不同的字符,问这样的两个子串长度乘积最大是多少 ...