2011-09-28 108 views
3

是否可以使用AspectJ來查找實現某個接口的所有類的列表。例如,我有一個接口MatchRule。然後我可以通過類DefaultMatchRuleCustomMatchRule具體實現MatchRule接口。 現在在運行時我想這將有2班DefaultMatchRuleCustomMatchRule使用Aspectj查找實現某個接口的類的列表

public interface MatchRule { 

} 

public class DefaultMatchRule implements MatchRule { 

} 

public class CustomMatchRule implements MatchRule { 

} 

public aspect FindSubClasses { 

// some thing to find list of classes implementing MatchRule interface 

} 
+0

你能解釋一下爲什麼你需要這樣的清單嗎?除了分析代碼外,我無法想象這樣的理由。在所有其他情況下,您可以在使用它們的時刻橫切課程。 – alehro

回答

0

唯一可能的途徑在運行時做到這一點可能是掃描所有的包和檢查,看看你的類是否實現該接口列表。

我想不出任何其他方式這是可能的。事實上,Eclipse有一個上下文菜單選項,顯示一個接口的「實現者」,但他們通過掃描包來實現這一點。

+0

感謝您的回答;我認爲,因爲我可以在aspectj中定義一個切入點,例如* MatchRule +;會有像我可以獲得這些信息的切入點上下文。我也看過PointCutParser,但找不到任何信息。 – user667022

1

AspectJ不是爲查找類而設計的。你最好的選擇是掃描類路徑並使用反射。

如果您可以接受編譯時信息,Eclipse AJDT插件爲所有AspectJ建議提供了良好的圖形信息。

但是,如果您可以忍受一些限制,您可以找到AspectJ建議的所有對象的類。

打印出用於實現MatchRule類的所有對象的類名:A液

@Aspect 
public class FindSubClassesAspect { 

    @Pointcut("execution(demo.MatchRule+.new(..))") 
    public void demoPointcut() { 
    } 

    @After("demoPointcut()") 
    public void afterDemoPointcut(
      JoinPoint joinPoint) { 
     FindSubClasses.addMatchRuleImplememtation(
       joinPoint.getTarget().getClass().getSimpleName()); 
    } 
} 

包含所有的MatchRule實現信息類:

public enum FindSubClasses {  
    ; 

    private static Set<String> matchRuleImplementations = 
     new HashSet<String>(); 

    public static void addMatchRuleImplememtation(String className) { 
     matchRuleImplementations.add(className); 
    } 

    public static Collection<String> getMatchRuleImplementations() {   
     return matchRuleImplementations; 
    } 
} 

一個簡單的驅動程序證明該方面工作:

public class Driver { 
    public static void main(String[] args) { 
     new DefaultMatchRule(); 
     new CustomMatchRule(); 

     Collection<String> matchRuleImplementations = 
      FindSubClasses.getMatchRuleImplementations(); 

     System.out.print("Clases that implements MatchRule: "); 
     for (String className : matchRuleImplementations) { 
      System.out.print(className + ", "); 
     } 
    } 
} 

執行此驅動器的輸出:

Clases實現MatchRule:DefaultMatchRule,CustomMatchRule,

我希望這有助於!

相關問題