[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1612] AspectJ 小サンプル (was 読書会 (Java スレッドプログラミング第 3 回議事録)



秋元@PFUです

takekawa@xxxxxxxxxxxxxx wrote:
> ---本書とは直接関係ないがその他の話題----
> *AspectJをつかって任意の場所で例外を出すテストをする話
>  秋元さんがまとめて報告してくれる予定。

ご指名にあずかりました。

任意の場所で例外を出すやつは、まだまとめきれてません。
さらに単純なやつですいませんが、末尾につけます。
正味4行程度のアスペクトでできることにびっくりさせられます。

> *WebDAV Httpを拡張してクライアント側からサーバの文書を書換える仕組み
> *wikiwikiのはなし
 どちらも文書コラボレーションのための仕組みですね。
  YukiWiki http://www.hyuki.com/yukiwiki/
   Wikiの説明はここなんかがいいかも

> *クラスの依存関係を出力するツール JDepend というものがあるらしい。
  http://www.clarkware.com/software/JDepend.html
   メトリックスツールなのかな

-- 
Akky (AKIMOTO, Hiroki)
private mailto:akky@xxxxxxxxxxx
http://www.geocities.co.jp/Playtown/1245/

==========================================================================
== ActionPerformedRecorderAspect.java
/*

AspectJの使い方の一例を示すサンプル

「actionPerformedという名前を持つメソッドが呼ばれたら、コンソールに
  呼ばれたメソッドの情報を出力する」

 以下はWindowsの場合で示すので、他の環境の人は適宜読み替えてほしい

 [JDKをインストール]
   例: c:\jdk1.3へ
   set JAVA_HOME=c:\jdk1.3

 [AspectJを展開]
   (http://aspectj.org/servlets/AJSiteのdownloadからjarファイルを入手)
   > d:
   > cd \
   > jar xvf jaraspectj07beta12-tools.jar

 [環境変数]
   > set ASPECTJ_HOME=d:\aspectj0.7
   > set ASPECTJC="%ASPECTJ_HOME%\bin\ajc"
   > set ASPECTJ_LIB="%ASPECTJ_HOME%\lib\aspectjrt.jar"

 [AspectJでコンパイル]
   (適当なGUIアプリのソースを用意する。例えば、JDKのdemo/jfc/SimpleExample)

   > %ASPECTJC% -classpath %ASPECTJ_LIB% *.java
    (*.javaには、対象のアプリケーションのソースと、自分で書いたアスペクト
     を指定する)

 [実行]
   > %JAVA_HOME%\bin\java -classpath %ASPECTJ_LIB% Test

 [動作確認]
   メソッド名が actionPerformed であるようなメソッドが呼ばれる操作を
   行うと(よくあるGUIアプリケーションの場合、画面の適当な操作で起こる
   でしょう)、コンソールに呼ばれたactionPerformedの情報が出る。


 [参考]
   AspectJ http://aspectj.org/
  「梅澤 真史のOOPSLA’2000レポート」
     http://www.ogis-ri.co.jp/otc/hiroba/Report/oopsla/oopsla.html
   AspectJを紹介してくださった高橋徹さんのウェブページ
     http://homepage2.nifty.com/torutk/
*/

/**
 * 呼ばれたactionPerformedを記録するアスペクト
 *
 * @author AKIMOTO, Hiroki
 */
aspect ActionPerformedRecorderAspect of eachobject(instanceof(*)) {
  /**
   * receptionで示されるクラス-メソッド条件にあったポイントを、
   * recordActionPerformedという名前で切り出す
   */
  pointcut recordActionPerformed(): receptions(* actionPerformed(..));
  /**
   * 記録を行うジョインポイント
   * recordActionPerformedで切り出されたメソッドの処理後に実施される
   * ただし、そのポイントについての記録が既にある場合は、何もしない
   */
  after(): recordActionPerformed() {
    System.out.println(thisJoinPoint.toString());
  }
}