在Java中为不同类型应用通用逻辑

时间:2015-08-20 16:14:26

标签: java generics java-7

我在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); } }

有没有办法让它成为通用的并且只能立即写入逻辑?

3 个答案:

答案 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.Fieldjava.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);
    }
}