1.   捕获对构造函数的调用
       pointcut <pointcut name>(<any values to be picked up>) : call(<optional modifier> <class>.new(<parameter types>));
2.   在执行构造函数时捕获它
      pointcut <pointcut name>(<any values to be picked up>) : execution(<optional modifier> <class>.new(<parameter types>));
3.   捕获何时初始化对象
      pointcut <pointcut name>(<any values to be picked up>) : initialization(<optional modifier> <class>.new(<parameter types>));
      initialization(Signature)切入点必须包含new关键字,Signature必须解析成特定类的构造函数,而不是一个简单的方法。
      由于AspectJ编译器中的编译器限制,当与around()通知关联时,不能使用initialization(Signature)切入点。
      与execution(Signature)切入点相比,使用initialization(Signature)切入点最大优点是:它提供了编译时检查,以确保签名实际上制定了一个构造函数。
4.   捕获何时将要初始化一个对象
      pointcut <pointcut name>(<any values to be picked up>) : preinitialization(<optional modifier> <class>.new(<parameter types>));
5.   捕获何时初始化类
      pointcut <pointcut name>(<any values to be picked up>) : staticinitialization(<class>);
package com.eric.aspectj;
public aspect CallNewRecipe {
 pointcut myClassConstructorWithIntAndStringPointcutStaticinitialization() : staticinitialization(MyClass);
 pointcut myClassConstructorWithIntAndStringPointcutCall() : call(MyClass.new(int, String));
 pointcut myClassConstructorWithIntAndStringPointcutExecution() : execution(MyClass.new(int, String));
 pointcut myClassConstructorWithIntAndStringPointcutPreinitialization() : preinitialization(MyClass.new(int, String));
 pointcut myClassConstructorWithIntAndStringPointcutInitialization() : initialization(MyClass.new(int, String));
 
 
 before() : myClassConstructorWithIntAndStringPointcutExecution() {
  System.out.println("-------------- Aspect Advice Logic Execution ---------------");
  System.out.println("In the advice picked by " + "myClassConstructorWithIntAndOthersPointcut()");
  System.out.println("The current type of object under construction is: ");
  System.out.println("getThis: " + thisJoinPoint.getThis());
  System.out.println("getTarget: " + thisJoinPoint.getTarget());
  System.out.println("getKind: " + thisJoinPoint.getKind());
  System.out.println("Signature: " + thisJoinPoint.getSignature());
  System.out.println("getName: " + thisJoinPoint.getSignature().getName());
  System.out.println("getDeclaringTypeName: " + thisJoinPoint.getSignature().getDeclaringTypeName());
  System.out.println("getDeclaringType: " + thisJoinPoint.getSignature().getDeclaringType());
  System.out.println("getModifiers: " + thisJoinPoint.getSignature().getModifiers());
  System.out.println("Source Line: " + thisJoinPoint.getSourceLocation());
  System.out.println("toString: " + thisJoinPoint.toString());
  System.out.println("--------------------------------------------------");
 }
 before() : myClassConstructorWithIntAndStringPointcutStaticinitialization() {
  System.out.println("--------------- Staticinitialization ------------------");
 }
 before() : myClassConstructorWithIntAndStringPointcutCall() {
  System.out.println("--------------- Call ------------------");
 }
 before() : myClassConstructorWithIntAndStringPointcutPreinitialization() {
  System.out.println("--------------- Preinitialization ------------------");
 }
 before() : myClassConstructorWithIntAndStringPointcutInitialization() {
  System.out.println("--------------- Initialization ------------------");
 }
}
package com.eric.aspectj;
public class MyClass {
 private int number;
 private String name;
 
 public MyClass(int number, String name) {
  this.number = number;
  this.name = name;
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  MyClass myObject = new MyClass(123, "Eric Chau");
 }
}
运行结果:
--------------- Staticinitialization ------------------
--------------- Call ------------------
--------------- Preinitialization ------------------
--------------- Initialization ------------------
-------------- Aspect Advice Logic Execution ---------------
In the advice picked by myClassConstructorWithIntAndOthersPointcut()
The current type of object under construction is: 
getThis: com.eric.aspectj.MyClass@10d448
getTarget: com.eric.aspectj.MyClass@10d448
getKind: constructor-execution
Signature: com.eric.aspectj.MyClass(int, String)
getName: <init>
getDeclaringTypeName: com.eric.aspectj.MyClass
getDeclaringType: class com.eric.aspectj.MyClass
getModifiers: 1
Source Line: MyClass.java:8
toString: execution(com.eric.aspectj.MyClass(int, String))
--------------------------------------------------
	posted on 2007-07-04 13:56 
周锐 阅读(270) 
评论(0)  编辑  收藏  所属分类: 
AspectJ