[英]Get Map<String, List<Object>> from List<Object> where the key is one of the fields of the objects
[英]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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.