我在Java下面给出了代码快照(两种方法)。
请注意,此处Field
java.lang.Field
且Method
java.lang.Method
,我正在使用{{ 1}}。
jdk1.7
这两种方法都在执行相同的任务(过滤),但针对不同的 /**
* Apply predicate filter and add into list if it apply(return true)
*
* @param methods list of methods in which method will be added in case predicate returns the true.
* @param method method which is being to check against the predicate
* @param predicate the predicate
*/
private static void applyPredicateForMethods(List<Method> methods, Method method, Predicate<Method> predicate){
if (predicate == null || predicate.apply(method)) {
if (!method.isAccessible())
method.setAccessible(true);
methods.add(method);
}
}
/**
* Apply predicate filter and add into list if it apply(return true)
*
* @param fields the list of fields in which method will be added in case predicate returns the true.
* @param field the field which is being to check against the predicate
* @param predicate the predicate
*/
private static void applyPredicateForFields(List<Field> fields, Field field, Predicate<Field> predicate){
if (predicate == null || predicate.apply(field)) {
if (!field.isAccessible())
field.setAccessible(true);
fields.add(field);
}
}
有没有办法让它成为通用的并且只能立即写入逻辑?
答案 0 :(得分:3)
两者都拥有超类(foreach ($getters as $getter) {
echo $entity->{$getter}(); // `foo!`
}
)并且您正在从该类访问相同的方法。看一下班级java.lang.reflect.AccessibleObject
。将它用作类型。
答案 1 :(得分:1)
以下是通用解决方案:
private static <T extends AccessibleObject> void applyPredicateForFields(List<T> objects,
T object, Predicate<T> predicate){
if (predicate == null || predicate.apply(object)) {
if (!object.isAccessible())
object.setAccessible(true);
objects.add(object);
}
}
答案 2 :(得分:0)
java.lang.reflect.Field
和java.lang.reflect.Method
都延伸java.lang.reflect.AccessibleObject
,它提供了您正在使用的方法。只需编写代码即可引用它:
private static void applyPredicate
(List<AccsibleObjects> objects,
AccessibleObject object,
Predicate<AccessibleObject> predicate) {
if (predicate == null || predicate.apply(object)) {
if (!object.isAccessible())
object.setAccessible(true);
objects.add(object);
}
}