我有以下2个类BaseObject:
public class BaseObject
{
private String name;
public String getName()
{
return name;
}
public static Predicate<? extends BaseObject> isNameEqualTo(String test)
{
return p -> p.getName().equals(test);
}
}
和用户:
public class User extends BaseObject
{
private String firstName;
public static Predicate<? extends User> isFirstNameEqualTo(String test)
{
return p -> p.getFirstName().equals(test);
}
}
我想要达到的目的是让用户打开对话框并过滤表格中的数据。该表由ObservableList<? extends BaseObject>
支持的FilteredList
组成。因此,当用户打开对话框时,应该有list,table,...包含所有可过滤的字段,如firstname,lastname等。每个扩展BaseObject
的类都应该提供返回Predicate
的静态方法如下
@FilterableField(name="firstName")
public static Predicate<? extends User> isFirstNameEqualTo(String test)
{
return p -> p.getFirstName().equals(test);
}
注释@FilterableField
用作指示字段是否可过滤以及作为字段本身元信息的容器。现在我的问题是使用反射我无法使用以下(test!)代码将Predicate
强制转换为Predicate<? extends User>
:
Set<Method> allMethods = ReflectionUtils.getAllMethods(User.class);
Map<FilterableField, Method> annotatedMethods = new HashMap<>();
for(Method m : allMethods)
{
FilterableField annotation = m.getAnnotation(FilterableField.class);
if(annotation == null)
{
continue;
}
annotatedMethods.put(annotation, m);
}
annotatedMethods.forEach((k,v)->{
System.out.println("Annotation : " + k.name() + " Method : " + v.getName());
if(k.name().equals("name"))
{
try
{
//Class clz = v.getDeclaringClass();
Class clz = Class.forName("Predicate<User>");
Predicate test = (Predicate<?>)v.invoke(null, "Hans");
clz.cast(test);
List<User> users = new ArrayList<User>();
User user = new User();
user.setName("Hans");
users.add(user);
user = new User();
user.setName("Werner");
users.add(user);
List<User> dummy = users.stream().filter(test).collect(Collectors.toList());
System.out.println("Main.reflectionPredicateTest - dummy: "+dummy);
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
});
因此,如果有人对如何实现这一点以及/或如何动态地将类实例强制转换为类似Predicate<? extends User>
的内容有一些想法,那么我会非常感激!