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プロジェクトの作成
  • コード開発(本明細書では簡単な例を提供する)
  • 三、簡単な例:
    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);
    	}
    
    }