帮助java中的反射和注释

时间:2010-05-30 17:50:41

标签: java reflection annotations

除了我自己没有能力更有效地执行此代码之外,我无法将代码加倍...

for (Method curr: all){
        if (curr.isAnnotationPresent(anno)){
            if (anno == Pre.class){
                for (String str : curr.getAnnotation(Pre.class).value()){
                    if (str.equals(method.getName()) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0){
                        toRun.add(curr);
                    }
                }
            } if (anno == Post.class) {
                for (String str : curr.getAnnotation(Post.class).value()){
                    if (str.equals(method.getName()) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0){
                        toRun.add(curr);
                    }
                }
            }
        }
    }

anno是一个参数 - Class<? extends Annotation>PrePost是我的注释,两者都有value(),这是一个字符串数组。

当然,这都是因为我让Eclipse自动填充了我还不了解的代码。

1 个答案:

答案 0 :(得分:2)

如果“更有效”意味着'用更少的代码行',那么为什么不合并两个if语句?我可以在它们之间看到的唯一区别是一个有Pre.class,另一个有Post.class,你已经在anno var中方便地获得了这个类引用:

for (Method curr : all) {
    if (curr.isAnnotationPresent(anno)) {
        if (anno == Pre.class || anno == Post.class){
            for (String str : curr.getAnnotation(anno).value()){
                if (str.equals(method.getName()) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0){
                    toRun.add(curr);
                }
            }
        }
    }
}

除此之外,如果anno既不是Pre.class也不是Post.class,那么执行外部for循环是没有意义的,所以你应该在外面进行检查(这可以节省对方法的迭代)如果用一个你不想要的注释调用它。您还可以在内部for循环之外移动对returnType和参数长度的检查(这样可以为每个值保存重复它们,如果它们不为真,则保存迭代)。

 if (anno == Pre.class || anno == Post.class){
    for (Method curr : all) {
        if (curr.isAnnotationPresent(anno) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0) {
            for (String str : curr.getAnnotation(anno).value()){
                if (str.equals(method.getName())) {
                    toRun.add(curr);
                }
            }
        }
    }
}