AOP:AspectJ符号化に基づく簡単な例
一、基本概念
AspectJは,フェースプログラミング向けのJavaベースの実装である.Javaに接続点(Join Point)という新しい概念を加えたが、実際には既存のJava概念の名前にすぎない.Java言語には、接点(pointcut)、通知(Advice)、タイプ間宣言(Inter-type declaration)、側面(Aspect)といういくつかの新しい構造を加えた.接点と通知はプログラムフローに動的に影響し,タイプ間宣言は静的影響プログラムのクラス階層構造であり,断面はこれらの新しい構造のすべてをカプセル化する.
接面、接続点、接点、通知に基づく概念は以下の通りである. Aspect:Aspect宣言はJavaのクラス宣言と似ており、AspectにはPointcutと対応するAdviceが含まれています. Joint point:プログラム内で明確に定義された点を表し、典型的にはメソッド呼び出し、クラスメンバーへのアクセス、例外処理ブロックの実行などが含まれ、それ自体が他のjoint pointをネストすることもできる. Point:joint pointのセットを表します.これらのjoint pointは、論理関係によって結合されたり、共通化、正規表現などによって集中されたりして、対応するAdviceが発生する場所を定義します. Advice:Adviceはpointcutで定義されたプログラムポイントの具体的な動作を定義し、before、after、aroundによってjoint pointの前後に実行されるコードを区別します.
接続ポイントは、プログラムフローの適切なポイントです.接点は、特定の接続点のセットと、これらの点の値を収集します.1つの通知は、接続ポイントが到着したときに実行されるコードであり、これらはすべてAspectJの動的部分である.接続点はプログラムの1つ1つの文のようなもので、接点は特定の文に設定されたブレークポイントであり、ブレークポイントのプログラムスタックの情報を収集し、通知はこのブレークポイントの前後に参加したいプログラム世代である.AspectJにも多くの異なる種類のタイプ間宣言があります.これにより、プログラマはプログラムの静的構造、名前、クラスのメンバー、およびクラス間の関係を変更できます.AspectJの側面は,注目点を横切るモジュールユニットである.Java言語のクラスに似ていますが、接点、通知、タイプ間宣言もカプセル化されています.
二、どのようにAJDT:AspectJ Development Toolsに基づいてAOPプログラムの開発を行いますか? ajdtのWebサイトの説明に従って、eclipseにajdtプラグインをインストールします.http://www.eclipse.org/ajdt/ ajdt - http://download.eclipse.org/tools/ajdt/43/update AspectJプロジェクトの作成 コード開発(本明細書では簡単な例を提供する) 三、簡単な例:
AspectJは,フェースプログラミング向けのJavaベースの実装である.Javaに接続点(Join Point)という新しい概念を加えたが、実際には既存のJava概念の名前にすぎない.Java言語には、接点(pointcut)、通知(Advice)、タイプ間宣言(Inter-type declaration)、側面(Aspect)といういくつかの新しい構造を加えた.接点と通知はプログラムフローに動的に影響し,タイプ間宣言は静的影響プログラムのクラス階層構造であり,断面はこれらの新しい構造のすべてをカプセル化する.
接面、接続点、接点、通知に基づく概念は以下の通りである.
接続ポイントは、プログラムフローの適切なポイントです.接点は、特定の接続点のセットと、これらの点の値を収集します.1つの通知は、接続ポイントが到着したときに実行されるコードであり、これらはすべてAspectJの動的部分である.接続点はプログラムの1つ1つの文のようなもので、接点は特定の文に設定されたブレークポイントであり、ブレークポイントのプログラムスタックの情報を収集し、通知はこのブレークポイントの前後に参加したいプログラム世代である.AspectJにも多くの異なる種類のタイプ間宣言があります.これにより、プログラマはプログラムの静的構造、名前、クラスのメンバー、およびクラス間の関係を変更できます.AspectJの側面は,注目点を横切るモジュールユニットである.Java言語のクラスに似ていますが、接点、通知、タイプ間宣言もカプセル化されています.
二、どのようにAJDT:AspectJ Development Toolsに基づいてAOPプログラムの開発を行いますか?
package aop.test;
public interface FigureElement {
public void setXY(int x,int y);
public void draw();
}
package aop.test;
public class Point implements FigureElement {
public int x;
private int y;
public int getX() {
return x;
}
public String setX(int x) {
System.out.println(" x :x="+x);
this.x = x;
return " x="+x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Point(){
}
public Point(int x,int y){
this.x=x;
this.y=y;
}
@Override
public void setXY(int x,int y) {
this.x=x;
this.y=y;
System.out.println("Point setXY: x="+x+",y="+y);
}
@Override
public void draw() {
System.out.println("Point draw");
}
@Override
public String toString(){
return "Point: x="+x+",y="+y;
}
}
package aop.test;
public aspect TestMain {
/**
* pointcut
*/
pointcut psimple() : call(void Point.*(int));
before() : psimple() {
System.out.println("psimpe ");
}
after() returning() : psimple() {
System.out.println("psimple ");
}
/**
* pointcut
*
* @param i
*/
pointcut psetX(int i) : call(String Point.setX(int)) && args(i);
before(int i) : psetX(i) {
System.out.println("psetX " + i);
}
after(int i) returning(String sReturn) : psetX(i) {
System.out.println("psetX " + i + ":" + sReturn);
}
/**
* pointcut
*
* @param fe
* @param x
* @param y
*/
pointcut psetXY(FigureElement fe, int x, int y) :
call(void FigureElement.setXY(int,int))
&& target(fe)
&& args(x,y);
// before(FigureElement fe, int x, int y) : psetXY(fe,x,y) {
// System.out.println("psetXY before" + fe + " move to x=" + x + ",y=" + y);
// }
after(FigureElement fe, int x, int y) returning() : psetXY(fe,x,y) {
System.out.println("psetXY after" + fe + " move to x=" + x + ",y=" + y);
}
before(FigureElement fe, int x, int y) :
call(void FigureElement.setXY(int,int))
&& target(fe)
&& args(x,y) {
System.out.println("psetXY before" + fe + " move to x=" + x + ",y=" + y);
}
public static void main(String[] args) {
Point p1 = new Point();
p1.setY(2);
p1.setX(2);
Point p2 = new Point(2, 2);
p2.setXY(2, 3);
}
}