簡體   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