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