从对象中的私有关键字段获取MethodHandle列表

问题描述 投票:1回答:1

我有一个包含许多私有字段的对象列表,我想根据来自数据库的几个关键字段对它们进行分组。方法类在另一个包中。我的对象看起来像

public class MyObject {
private String field1;

private String field2;

private String field3;

private Integer field4;
...}

关键字段可以是Object中字段的任意组合

我试图获得关键字段的MethodHandle列表。这个MethodHandle列表稍后将被流式传输并为Collectors.groupingBy调用以形成Map。

private static Map<List<String>, List<MyObject>>
        groupListBy(List<MyObject> objList, String[] keyFields) {

    final MethodHandles.Lookup lookup = MethodHandles.lookup();
    List<MethodHandle> handles = Arrays.stream(keyFields)
            .map(field -> {
                try {
                    // What I tried by didn't work
                    // Field f = objList.get(0).getClass().getDeclaredField(field);
                    // f.setAccessible(true);
                    return lookup.findGetter(MyObject.class, field, String.class);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }).collect(Collectors.toList());
     .
     .
};

但是,在为MyObject中的私有字段形成MethodHandle列表时,将存在访问私有成员的非法访问异常。

我可以知道如何访问这些字段。谢谢!

编辑:我知道在Java 9中有一个名为privateLookupIn()的方法,但我目前正在使用Java 8。

java private-members collectors methodhandle
1个回答
0
投票

我查看了其他一些答案并提出了这个问题

    final MethodHandles.Lookup lookup = MethodHandles.lookup();
    Object obj = new Object();
    List<MethodHandle> handles = Arrays.stream(keyFields)
            .map(field -> {
                try {
                    PropertyDescriptor pd = new PropertyDescriptor(field, Object.class);
                    Method getter = pd.getReadMethod();
                    getter.setAccessible(true);
                    MethodHandle pmh = lookup.unreflect(getter);
                    return pmh;
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }).collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.