如何获取我的对象的特定属性?

 豆豆马捷 发布于 2023-02-12 10:52

假设我有这门课.

class People {
    private String name;
    private int age;
    /** other stuff constructor / getters / setters / etc. **/
}

让我们说我有这个清单:

List people = Arrays.asList(new People("Mark", 21), new People("Bob",17), new People("Alex", 22));

现在我希望能够获得List特定属性的所有用户.

使用Java 8,我可以创建一个接受我想要的函数的方法:

public static  List processElements(Iterable source, Function  mapper) {
    List l = new ArrayList<>();
    for (X p : source) 
        l.add(mapper.apply(p));
    return l;
}

然后我将能够执行一些调用:

List listNames = processElements(people, p -> p.getName()); 
List listAges = processElements(people, p -> p.getAge()); 

然而,这在Java 7中是不可能的(我知道它存在于Guava中,但我只想使用JDK来提出解决方案).

这是我用反射得到的:

public static List processElements(List l, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
        Field field = People.class.getDeclaredField(fieldName);
        field.setAccessible(true);
        List list = new ArrayList<>();
        for(People p : l){
            list.add(field.get(p));
        }
        field.setAccessible(false);
        return list;
}


现在我可以做一些List listNames = processElements(people, "name");非常有效的事情.

但我觉得不舒服:

    我得到了一个 List

    每当我使用反射时,我总觉得它存在一个更好的实现而不使用它

    使用field.setAccessible(true);不是很安全

    所以我的问题是:

      是否可以在不使用JDK反射(不使用Guava或Functional Java)的情况下执行相同的操作?

      如何根据我作为参数传递给我的方法的字段类型获取String或Integer列表?

    谢谢

    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有