2010-02-10 135 views
10

我開始了「爲了好玩,沒人知道,沒有人關心」開源項目(LinkSet)。有沒有一種更有效的方法來獲得註釋的方法?

在一個地方,我需要得到一個類的註釋方法。

有沒有比這更有效的方法呢?我的意思是不需要遍歷每種方法?

for (final Method method : cls.getDeclaredMethods()) { 

    final HandlerMethod handler = method.getAnnotation(HandlerMethod.class); 
     if (handler != null) { 
       return method; 
      } 
     } 
+1

如果你只是想知道,如果該方法具有註釋和不關心註釋的內容,你可以調用'method.isAnnotationPresent(HandlerMethod.class)' – 2010-02-10 14:26:21

回答

1

號但這還不是低效的。

例如彈簧使用下面的代碼:

public static <A extends Annotation> A getAnnotation(
     Method method, Class<A> annotationType) { 

    return BridgeMethodResolver. 
     findBridgedMethod(method).getAnnotation(annotationType); 
} 

(其中BridgedMethodResolver是另一個話題,但它只是返回Method對象)

此外,而不是比較null,你可以檢查一個註釋是否與isAnnotationPresent(YourAnnotation.class)一致(如問題下面的評論中所建議的那樣)

+0

那麼它有點像O( m *(1 + a))其中m =方法數量和a =每種方法的平均註釋數量。 a通常接近0,所以它實際上是O(m)。像O(log(m))這樣的東西如果經常調用這段代碼會更好。 – 2010-02-10 14:14:42

+0

和'm'很少超過10;} – Bozho 2010-02-10 14:21:15

+0

嗯 - 好點:) – 2010-02-10 14:22:43

1

如果您打算爲每個班級打幾次電話你可以創建一個像類一樣的描述符,它只會緩存這種類型的信息。然後,當您想要檢索信息時,只需查看它的描述符即可。

要回答你的問題:

Class<?> _class = Whatever.class; 
Annotation[] annos = _class.getAnnotations(); 

會返回一個類的所有註釋。你所做的只會返回方法的第一個註釋。 Like wise:

Annotion[] annos = myMethod.getAnnotations(); 

返回給定方法的所有註釋。

+0

將不會返回僅級別級別的annotarions ?方法將不會包含,並且他對它們感興趣 – Bozho 2010-02-10 14:22:43

+0

它們已經被緩存在'Method'對象中 - 它使用的地圖是 – Bozho 2010-02-10 14:33:14

+0

是的,但是每次需要時都必須使用反射。我說的是一旦到達那個地圖,再也不會經歷反思。 – wheaties 2010-02-10 14:50:41

12

查看Reflections(依賴關係:GuavaJavassist)。這是一個已經優化了大部分內容的圖書館。有一個適合您的功能需求的Reflections#getMethodsAnnotatedWith()

這是SSCCE,只是複製'n'paste'n'run它。

package com.stackoverflow; 

import java.lang.reflect.Method; 
import java.util.Set; 

import org.reflections.Reflections; 
import org.reflections.scanners.MethodAnnotationsScanner; 
import org.reflections.util.ClasspathHelper; 
import org.reflections.util.ConfigurationBuilder; 

public class Test { 

    @Deprecated 
    public static void main(String[] args) { 
     Reflections reflections = new Reflections(new ConfigurationBuilder() 
      .setUrls(ClasspathHelper.forPackage("com.stackoverflow")) 
      .setScanners(new MethodAnnotationsScanner())); 
     Set<Method> methods = reflections.getMethodsAnnotatedWith(Deprecated.class); 
     System.out.println(methods); 
    } 

} 
相關問題