2010-05-30 99 views
0

我在与比我自己缺乏更有效地做到这一点的能力以外,没有理由对我的代码加倍麻烦的反射和注解......帮助在Java

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

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

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

+0

如果'anno'既不是,也不是'toRun'类型? – 2010-05-30 17:56:40

+0

尝试消除冗余(在条件表达式中)。 – 2010-05-30 18:01:36

回答

2

如果'更有效',你的意思是'更少的代码行',那么为什么不合并两个if语句?我可以在它们之间看到的唯一区别是一个有Pre.class在其他有Post.class,你已经有一个类引用方便在阿鲁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,所以你应该在外面做这个检查(这样可以节省迭代方法,如果它用一个你不想要的注解调用的话)。您也可以将检查的returnType和参数长度移到inner for循环之外(这样可以节省每个值的重复检查次数,并且如果它们不是真的,则可以保存迭代)。

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); 
       } 
      } 
     } 
    } 
}
+0

因为'curr.getAnnotation(anno).value()'不能编译。因为它不知道'anno'是什么注释,所以它不知道它有一个'value()'。是我使用(Pre)(curr ...)来投射它,然后它会起作用,但那并不能真正推动我到任何地方。 – Yonatan 2010-05-30 19:06:43

+0

啊。嗯。我想你必须这样做:'final String [] values = anno == Pre.class? curr.getAnnotation(Pre.class).value():curr.getAnnotation(Post.class).value();',然后遍历它。丑陋的,但不能看到任何其他的方式,因为你不能做任何类型的带注释的继承:/ – Chris 2010-05-30 19:52:55

+0

有可能做一个基本注释,Pre'和'Post'会继承。我们称之为“BaseAnno”。然后使用'anno instanceof BaseAnno'并稍后投射。 – oshai 2011-01-05 21:56:50