我有一个包含许多私有字段的对象列表,我想根据来自数据库的几个关键字段对它们进行分组。方法类在另一个包中。我的对象看起来像
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。
我查看了其他一些答案并提出了这个问题
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());