aspectj為類(lèi)和對(duì)象的構(gòu)造和初始化中每個(gè)階段都提供了切入點(diǎn)
捕獲對(duì)構(gòu)造函數(shù)的調(diào)用
形式:call(ConstructorPattern)
定義:Picks out each constructor call join point whose signature matches ConstructorPattern.
demo
package aspectj;
public class MyClass {
public void b() {
System.out.println("call b");
}
MyClass(int x) {
}
public static void main(String[] args) {
MyClass myClass = new MyClass(3);
myClass.b();
}
}
package aspectj;
public aspect HelloWorld {
//具有new關(guān)鍵字的切入點(diǎn)會(huì)捕獲joinPoint,帶上必要的參數(shù)
pointcut callPointcut():call(MyClass.new(int));
before(): callPointcut()
{
System.out.println("hello");
System.out.println(thisJoinPoint.getSignature());
System.out.println(thisJoinPoint.getSourceLocation());
}
}
輸出
hello
aspectj.MyClass(int)
MyClass.java:12
call b
調(diào)用順序,參考
在執(zhí)行構(gòu)造函數(shù)時(shí)捕獲它
形式:execution(ConstructorPattern)
定義:Picks out each constructor execution join point whose signature matches ConstructorPattern.
demo
package aspectj;
public aspect HelloWorld {
//具有new關(guān)鍵字的切入點(diǎn)會(huì)捕獲joinPoint,帶上必要的參數(shù)
pointcut callPointcut():execution(MyClass.new(int));
before(): callPointcut()
{
System.out.println("hello");
System.out.println(thisJoinPoint.getSignature());
System.out.println(thisJoinPoint.getSourceLocation());
}
}
輸出
hello
aspectj.MyClass(int)
MyClass.java:8
call b
調(diào)用順序參考
捕獲何時(shí)初始化對(duì)象
形式:initialization(ConstructorPattern)
定義:Picks out each object initialization join point whose signature matches ConstructorPattern.
demo在后面一起寫(xiě)
捕獲何時(shí)將要初始化對(duì)象
形式:preinitialization(ConstructorPattern)
定義:Picks out each object pre-initialization join point whose signature matches ConstructorPattern.
通過(guò)下圖來(lái)區(qū)分preinitialization以及initialization,也可以參照后面demo
捕獲何時(shí)初始化類(lèi)
staticinitialization(TypePattern)
Picks out each static initializer execution join point whose signature matches TypePattern.
下面一起列出demo
package aspectj;
public class MyClass extends SuperClass{
static {
System.out.println("MyClass.static");
}
MyClass(int x) {
super(x);
}
public static void main(String[] args) {
MyClass myClass = new MyClass(3);
}
}
package aspectj;
public class SuperClass {
static {
System.out.println("SuperClass.static");
}
SuperClass(int x){}
}
package aspectj;
public aspect HelloWorld {
pointcut callPointcut():execution(SuperClass+.new(int));
before(): callPointcut()
{
System.out.println("execution");
System.out.println(thisJoinPoint.getSourceLocation());
}
pointcut initializationPointcut():initialization(SuperClass+.new(int));
before(): initializationPointcut()
{
System.out.println("initialization");
System.out.println(thisJoinPoint.getSourceLocation());
}
pointcut preInitPointcut():preinitialization(SuperClass+.new(int));
before(): preInitPointcut()
{
System.out.println("preinitialization");
System.out.println(thisJoinPoint.getSourceLocation());
}
pointcut staticInitPointcut():staticinitialization(SuperClass+);
before(): staticInitPointcut()
{
System.out.println("staticinitialization");
System.out.println(thisJoinPoint.getSourceLocation());
}
}
輸出
staticinitialization
SuperClass.java:5
SuperClass.static
staticinitialization
MyClass.java:5
MyClass.static
preinitialization
MyClass.java:7
preinitialization
SuperClass.java:7
initialization
SuperClass.java:7
execution
SuperClass.java:7
initialization
MyClass.java:7
execution
MyClass.java:7
這里注意staticinitialization,initialization,preinitialization調(diào)用順序即可
雖然輸出的thisJoinPoint.getSourceLocation()結(jié)果是一樣碾盟,但是順序不一樣
備注
ConstructorPattern =
[ModifiersPattern ]
[TypePattern . ] new (TypePattern | ".." , ...)
[ throws ThrowsPattern ]
refer
http://itfish.net/article/50191.html
https://eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html
《aspectj cookbook》