繁体   English   中英

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

[英]Get List of MethodHandle from key fields which are private in an object

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

public class MyObject {
private String field1;

private String field2;

private String field3;

private Integer field4;
...}

并且关键字段可以是对象中字段的任意组合

我试图获取关键字段的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。

我浏览了其他一些答案,并提出了

    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());

获取 Map <string, list<object> &gt; 从列表<object>其中键是对象的字段之一<div id="text_translate"><p>我有一个 object 如下</p><pre>public class Model { private String key; private String data1; private String data2; private String data3; // getters }</pre><p> 这些模型的列表正在通过数据层返回。 现在我想创建一个Map&lt;String, List&lt;Model&gt;&gt; ,其键是Model class 中的“键”字段。 有多个具有不同数据值的重复“键”。 我有以下现有解决方案,但需要一种更简单更好的方法。 没有广泛使用 Java 8 所以对大多数方法不太熟悉,并且由于我没有时间研究而需要尽快解决。</p><pre> List&lt;Model&gt; models = modelRepo.getAllModels(); Set&lt;String&gt; keys = models.stream().map(Model::getKey).collect(Collectors.toSet()); Map&lt;String, List&lt;Model&gt;&gt; result = new HashMap&lt;&gt;(); keys.stream().forEach(key -&gt; { List&lt;Model&gt; modelList = new ArrayList&lt;&gt;(); models.stream().forEach(model -&gt; { if (model.getKey().equals(key)) { modelList.add(model); } }); result.put(key, modelList); });</pre></div></object></string,>

[英]Get Map<String, List<Object>> from List<Object> where the key is one of the fields of the objects

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 获取 Map <string, list<object> &gt; 从列表<object>其中键是对象的字段之一<div id="text_translate"><p>我有一个 object 如下</p><pre>public class Model { private String key; private String data1; private String data2; private String data3; // getters }</pre><p> 这些模型的列表正在通过数据层返回。 现在我想创建一个Map&lt;String, List&lt;Model&gt;&gt; ,其键是Model class 中的“键”字段。 有多个具有不同数据值的重复“键”。 我有以下现有解决方案,但需要一种更简单更好的方法。 没有广泛使用 Java 8 所以对大多数方法不太熟悉,并且由于我没有时间研究而需要尽快解决。</p><pre> List&lt;Model&gt; models = modelRepo.getAllModels(); Set&lt;String&gt; keys = models.stream().map(Model::getKey).collect(Collectors.toSet()); Map&lt;String, List&lt;Model&gt;&gt; result = new HashMap&lt;&gt;(); keys.stream().forEach(key -&gt; { List&lt;Model&gt; modelList = new ArrayList&lt;&gt;(); models.stream().forEach(model -&gt; { if (model.getKey().equals(key)) { modelList.add(model); } }); result.put(key, modelList); });</pre></div></object></string,> 列出Java对象的所有私有字段? 从PEM获取私钥 为什么来自 MethodHandle 的 WrongMethodTypeException? 我的 object 类型不正确吗? 如何从Java中的私钥对象获取RSA公钥 从私钥模数和私钥指数中获取 RSA 公钥 如何从另一个班级获得私有字段? 从 HashMap 中获取包含键子串的对象 根据对象列表中的某些字段获取最小对象 Java 8 Stream convert list to map, where map key is an object derived from two fields of the list?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM