简体   繁体   English

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

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

I have a list of object with many private fields and I would want to group them according to a few key fields that come from a database. 我有一个包含许多私有字段的对象列表,我想根据数据库中的一些关键字段对它们进行分组。 The method class is in another package. 方法类在另一个包中。 My object would look like 我的对象看起来像

public class MyObject {
private String field1;

private String field2;

private String field3;

private Integer field4;
...}

and the key fields could be any combination of the fields in the Object 并且关键字段可以是对象中字段的任意组合

I have tried to get a list of MethodHandle for key fields. 我试图获取关键字段的MethodHandle列表。 This list of MethodHandle would be later streamed and invoked for Collectors.groupingBy to form a Map. 该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());
     .
     .
};

However, there would be an Illegal Access Exception for accessing a private member when forming a list of MethodHandle for the private fields in the MyObject. 但是,在为MyObject中的私有字段形成MethodHandle列表时,访问私有成员会出现非法访问异常。

May I know how can I access those fields. 我可以知道如何访问这些字段。 Thank you! 谢谢!

Edit: I know there is a method called privateLookupIn() in Java 9, but I'm using Java 8 currently. 编辑:我知道Java 9中有一个称为privateLookupIn()的方法,但是我目前正在使用Java 8。

I looked through some other answers and came up with this 我浏览了其他一些答案,并提出了

    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,> - Get Map<String, List<Object>> from List<Object> where the key is one of the fields of the objects 列出Java对象的所有私有字段? - List all private fields of a Java object? 从PEM获取私钥 - Get private key from PEM 为什么来自 MethodHandle 的 WrongMethodTypeException? 我的 object 类型不正确吗? - Why a WrongMethodTypeException from MethodHandle? Is my object type incorrect? 如何从Java中的私钥对象获取RSA公钥 - How to get the RSA public-key from private-key Object in Java 从私钥模数和私钥指数中获取 RSA 公钥 - Get RSA public key from private key modulus and private exponent 如何从另一个班级获得私有字段? - How to get private fields from another class? 从 HashMap 中获取包含键子串的对象 - Get object from HashMap which contains key substring 根据对象列表中的某些字段获取最小对象 - Get Minimum object based on some fields from a List of objects Java 8 Stream convert list to map, where map key is an object derived from two fields of the list? - 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