﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-AspectJ</title><link>http://www.blogjava.net/rain1102/category/37631.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 20 Feb 2009 18:26:19 GMT</lastBuildDate><pubDate>Fri, 20 Feb 2009 18:26:19 GMT</pubDate><ttl>60</ttl><item><title>控制通知优先级</title><link>http://www.blogjava.net/rain1102/archive/2007/07/05/128334.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 05 Jul 2007 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/05/128334.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/128334.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/05/128334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/128334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/128334.html</trackback:ping><description><![CDATA[如果把位于不同方面中的相同类型的通知应用于同一个连接点，则可以使用declare precedence语句来控制通知的优先级。语法：<br>declare precedence : TypePattern, TypePattern, ..;<br>如果相同类型的通知位于同一个方面中，那么在把通知应用于共享的连接点时，可以使用通知声明的位置来指示其优先级。按在方面中声明before()和around()通知类型的次序，按先后顺序执行。而after()相反，声明在后面的执行优先。<img src ="http://www.blogjava.net/rain1102/aggbug/128334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-05 14:28 <a href="http://www.blogjava.net/rain1102/archive/2007/07/05/128334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主要的pointcuts类型</title><link>http://www.blogjava.net/rain1102/archive/2007/07/04/128141.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jul 2007 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/04/128141.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/128141.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/04/128141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/128141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/128141.html</trackback:ping><description><![CDATA[<strong>分类pointcuts<br></strong>&nbsp;&nbsp;&nbsp; 遵循特定的语法用于捕获每一个种类的可使用连接点。<br>&nbsp;&nbsp;&nbsp; 主要的种类：<br>
<ul>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">方法执行：execution(MethodSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">方法调用：call(MethodSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">构造器执行：execution(ConstructorSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">构造器调用：call(ConstructorSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">类初始化：staticinitialization(TypeSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">属性读操作：get(FieldSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">属性写操作：set(FieldSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">例外处理执行：handler(TypeSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">对象初始化：initialization(ConstructorSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">对象预先初始化：preinitialization(ConstructorSignature)</span>
    <li><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">Advice执行：adviceexecution()</span> </li>
</ul>
&nbsp;&nbsp; <strong>基于控制流的pointcuts</strong><br>&nbsp;&nbsp; 主要包括两种类型的控制流：<br>&nbsp;&nbsp; cflow(Pointcut)，捕获所有的连接点在指定的方法执行中，包括执行方法本身。<br>&nbsp;&nbsp; cflowbelow(Pointcut)，捕获所有的连接点在指定的方法执行中，除了执行方法本身。<br><br>&nbsp;&nbsp; 如以下的例子：<br>&nbsp;&nbsp; <strong>cflow(call(* Account.debit(..))</strong><br>&nbsp;&nbsp; 所有的debit方法中的连接点，包括debit方法本身<br>&nbsp;&nbsp; <strong>cflowbelow(call(* Account.debit(..))</strong><br>&nbsp;&nbsp; 所有debit方法中的连接点，除了debit方法本身<br>&nbsp;&nbsp; <strong>cflow(transactedOperations())</strong><br>&nbsp;&nbsp; 所有由transactedOperations捕获的连接点<br>&nbsp;&nbsp; <strong>cflowbelow(execution(Account.new(..))</strong><br>&nbsp;&nbsp; 所有在Account 构造器中执行的连接点<br><br>&nbsp;&nbsp; <strong>基于词汇结构的连接点</strong><br>&nbsp;&nbsp; 源代码片断。，如within()和withincode()<br>&nbsp;&nbsp; within ：捕获在指定类或者方面中的程序体中的所有连接点，包括内部类。<br>&nbsp;&nbsp; Withincode：用于捕获在构造器或者方法中的所有连接点，包括在其中的本地类<br><br>&nbsp;&nbsp; <strong>执行对象连接点</strong><br>&nbsp;&nbsp; 匹配this,和target对象，作为方法被调用的对象。<br>&nbsp;&nbsp; this(Account)，所有Account的实例的执行点，匹配所有的连接点，如方法调用，属性设置，当前的执行对象为Account，或者其子类。<br>&nbsp;&nbsp; target(Account)：匹配所有的连接点，目标对象为Account或其子类。<br><br>&nbsp;&nbsp; 必须执行相应的类型，不能使用*,或者..通配符。当前静态方法，不能被匹配。<br><br>&nbsp;&nbsp; 在within()和this()中的区别：<br>&nbsp;&nbsp; 一个是程序体，而另一个为对象执行。<br><br>&nbsp;&nbsp; <strong>参数pointcuts</strong><br>&nbsp;&nbsp; 用于捕获参数类型的连接点。<br>&nbsp;&nbsp; args(String,..,int)<br>&nbsp;&nbsp; args(RemoteException)<br><br>&nbsp;&nbsp; <strong>条件检测pointcuts</strong><br>&nbsp;&nbsp; if(System.currentTimeMillis()&gt;triggerTime)<br><img src ="http://www.blogjava.net/rain1102/aggbug/128141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-04 16:39 <a href="http://www.blogjava.net/rain1102/archive/2007/07/04/128141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>捕获程序作用域内的连接点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/04/128122.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jul 2007 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/04/128122.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/128122.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/04/128122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/128122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/128122.html</trackback:ping><description><![CDATA[1.&nbsp;&nbsp;&nbsp;捕获特定类中的所有连接点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用within(TypePattern)切入点，利用TypePattern指定特定类类型模式。语法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : within(&lt;class&gt;);<br>2.&nbsp;&nbsp;&nbsp;&nbsp;捕获特定方法内的所有连接点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用withincode(Signature)切入点。语法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : withincode(&lt;modifier&gt; &lt;class&gt;.&lt;method&gt;(&lt;parameter types&gt;));<br><br><img src ="http://www.blogjava.net/rain1102/aggbug/128122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-04 15:37 <a href="http://www.blogjava.net/rain1102/archive/2007/07/04/128122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>捕获属性上的连接点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/04/128104.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jul 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/04/128104.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/128104.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/04/128104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/128104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/128104.html</trackback:ping><description><![CDATA[<p><strong>捕获何时访问对象的属性</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : get(&lt;optional modifier&gt; &lt;type&gt; &lt;class&gt;.&lt;field&gt;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get(Signature)切入点不能捕获对静态属性的访问，尽管从AspectJ的语法角度讲以这种方式定义切入点是完全合法的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用after() returning(&lt;ReturnValue&gt;)形式的通知，它在声明的returning()部分中带有一个标识符，用于包含访问过的值。<br><strong>捕获何时修改对象的字段</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : set(&lt;optional modifier&gt; &lt;type&gt; &lt;class&gt;.&lt;field&gt;);<br><br>package com.eric.aspectj;</p>
<p>public aspect GetRecipe {<br>&nbsp;pointcut getNamePointcut() : get(String MyClass.name);<br>&nbsp;before() : getNamePointcut() {<br>&nbsp;&nbsp;System.out.println("-------------- Aspect Advice Logic ---------------");<br>&nbsp;&nbsp;System.out.println("In the advice picked by " + "getNamePointcut()");<br>&nbsp;&nbsp;System.out.println("Signature: " + thisJoinPoint.getStaticPart().getSignature());<br>&nbsp;&nbsp;System.out.println("Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());<br>&nbsp;&nbsp;System.out.println("--------------------------------------------------");<br>&nbsp;}<br>&nbsp;after() returning(String value) : getNamePointcut() {<br>&nbsp;<span style="COLOR: #008000">&nbsp;System.out.println("Value being accessed is " + value);</span><br>&nbsp;}<br>}<br><br>package com.eric.aspectj;</p>
<p>public class MyClass {<br>&nbsp;public static final String CONSTANT = "CONSTANT STRING";<br>&nbsp;private int number;<br>&nbsp;private String name;</p>
<p>&nbsp;public String getName()<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println("<span style="COLOR: #008000">In the getName() method</span>");<br>&nbsp;&nbsp;return this.name;<br>&nbsp;}</p>
<p>&nbsp;public void setName(String name)<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println("In the setName(String) method");<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;&nbsp;System.out.println("The name field has been set");<br>&nbsp;}</p>
<p>&nbsp;public int getNumber()<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println("In the getNumber() method");<br>&nbsp;&nbsp;return this.number;<br>&nbsp;}</p>
<p>&nbsp;public void setNumber(int number)<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println("In the setNumber(int) method");<br>&nbsp;&nbsp;this.number = number;<br>&nbsp;&nbsp;System.out.println("The number field has been set");<br>&nbsp;}</p>
<p>&nbsp;public static final void main(String args[])<br>&nbsp;{<br>&nbsp;&nbsp;MyClass myObject = new MyClass();</p>
<p>&nbsp;&nbsp;myObject.setName("Eric Chau");<br>&nbsp;&nbsp;System.out.println("The name has been set");</p>
<p>&nbsp;&nbsp;myObject.setNumber(88888888);<br>&nbsp;&nbsp;System.out.println("The number has been set");<br>&nbsp;&nbsp;System.out.println("Name Stored = " + myObject.getName());<br>&nbsp;&nbsp;System.out.println("Number Stored = " + myObject.getNumber());</p>
<p>&nbsp;&nbsp;System.out.println("The constant value is " + MyClass.CONSTANT);</p>
<p>&nbsp;}<br>}<br><br>运行结果：<br>In the setName(String) method<br>The name field has been set<br>The name has been set<br>In the setNumber(int) method<br>The number field has been set<br>The number has been set<br><span style="COLOR: #008000">In the getName() method</span><br>-------------- Aspect Advice Logic ---------------<br>In the advice picked by getNamePointcut()<br>Signature: String com.eric.aspectj.MyClass.name<br>Source Line: MyClass.java:11<br>--------------------------------------------------<br><span style="COLOR: #008000">Value being accessed is Eric Chau</span><br>Name Stored = Eric Chau<br>In the getNumber() method<br>Number Stored = 88888888<br>The constant value is CONSTANT STRING</p><img src ="http://www.blogjava.net/rain1102/aggbug/128104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-04 14:31 <a href="http://www.blogjava.net/rain1102/archive/2007/07/04/128104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>捕获类和对象构造上的连接点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/04/128095.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jul 2007 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/04/128095.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/128095.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/04/128095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/128095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/128095.html</trackback:ping><description><![CDATA[<p><strong>1.&nbsp;&nbsp;&nbsp;捕获对构造函数的调用</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : call(&lt;optional modifier&gt; &lt;class&gt;.new(&lt;parameter types&gt;));<br><br><strong>2.&nbsp;&nbsp;&nbsp;在执行构造函数时捕获它</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : execution(&lt;optional modifier&gt; &lt;class&gt;.new(&lt;parameter types&gt;));<br><br><strong>3.&nbsp;&nbsp;&nbsp;捕获何时初始化对象</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : initialization(&lt;optional modifier&gt; &lt;class&gt;.new(&lt;parameter types&gt;));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialization(Signature)切入点必须包含new关键字，Signature必须解析成特定类的构造函数，而不是一个简单的方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于AspectJ编译器中的编译器限制，当与around()通知关联时，不能使用initialization(Signature)切入点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与execution(Signature)切入点相比，使用initialization(Signature)切入点最大优点是：它提供了编译时检查，以确保签名实际上制定了一个构造函数。<br><br><strong>4.&nbsp;&nbsp;&nbsp;捕获何时将要初始化一个对象</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : preinitialization(&lt;optional modifier&gt; &lt;class&gt;.new(&lt;parameter types&gt;));<br><br><strong>5.&nbsp;&nbsp;&nbsp;捕获何时初始化类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : staticinitialization(&lt;class&gt;);<br><br><br>package com.eric.aspectj;</p>
<p>public aspect CallNewRecipe {<br>&nbsp;pointcut myClassConstructorWithIntAndStringPointcutStaticinitialization() : staticinitialization(MyClass);<br>&nbsp;pointcut myClassConstructorWithIntAndStringPointcutCall() : call(MyClass.new(int, String));<br>&nbsp;pointcut myClassConstructorWithIntAndStringPointcutExecution() : execution(MyClass.new(int, String));<br>&nbsp;pointcut myClassConstructorWithIntAndStringPointcutPreinitialization() : preinitialization(MyClass.new(int, String));<br>&nbsp;pointcut myClassConstructorWithIntAndStringPointcutInitialization() : initialization(MyClass.new(int, String));<br>&nbsp;<br>&nbsp;<br>&nbsp;before() : myClassConstructorWithIntAndStringPointcutExecution() {<br>&nbsp;&nbsp;System.out.println("-------------- Aspect Advice Logic Execution ---------------");<br>&nbsp;&nbsp;System.out.println("In the advice picked by " + "myClassConstructorWithIntAndOthersPointcut()");<br>&nbsp;&nbsp;System.out.println("The current type of object under construction is: ");<br>&nbsp;&nbsp;System.out.println("getThis: " + thisJoinPoint.getThis());<br>&nbsp;&nbsp;System.out.println("getTarget: " + thisJoinPoint.getTarget());<br>&nbsp;&nbsp;System.out.println("getKind: " + thisJoinPoint.getKind());<br>&nbsp;&nbsp;System.out.println("Signature: " + thisJoinPoint.getSignature());<br>&nbsp;&nbsp;System.out.println("getName: " + thisJoinPoint.getSignature().getName());<br>&nbsp;&nbsp;System.out.println("getDeclaringTypeName: " + thisJoinPoint.getSignature().getDeclaringTypeName());<br>&nbsp;&nbsp;System.out.println("getDeclaringType: " + thisJoinPoint.getSignature().getDeclaringType());<br>&nbsp;&nbsp;System.out.println("getModifiers: " + thisJoinPoint.getSignature().getModifiers());<br>&nbsp;&nbsp;System.out.println("Source Line: " + thisJoinPoint.getSourceLocation());<br>&nbsp;&nbsp;System.out.println("toString: " + thisJoinPoint.toString());<br>&nbsp;&nbsp;System.out.println("--------------------------------------------------");<br>&nbsp;}<br>&nbsp;before() : myClassConstructorWithIntAndStringPointcutStaticinitialization() {<br>&nbsp;&nbsp;System.out.println("--------------- Staticinitialization ------------------");<br>&nbsp;}<br>&nbsp;before() : myClassConstructorWithIntAndStringPointcutCall() {<br>&nbsp;&nbsp;System.out.println("--------------- Call ------------------");<br>&nbsp;}<br>&nbsp;before() : myClassConstructorWithIntAndStringPointcutPreinitialization() {<br>&nbsp;&nbsp;System.out.println("--------------- Preinitialization ------------------");<br>&nbsp;}<br>&nbsp;before() : myClassConstructorWithIntAndStringPointcutInitialization() {<br>&nbsp;&nbsp;System.out.println("--------------- Initialization ------------------");<br>&nbsp;}<br>}<br><br>package com.eric.aspectj;</p>
<p>public class MyClass {</p>
<p>&nbsp;private int number;<br>&nbsp;private String name;<br>&nbsp;<br>&nbsp;public MyClass(int number, String name) {<br>&nbsp;&nbsp;this.number = number;<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;}<br>&nbsp;/**<br>&nbsp; * @param args<br>&nbsp; */<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;// TODO Auto-generated method stub<br>&nbsp;&nbsp;MyClass myObject = new MyClass(123, "Eric Chau");<br>&nbsp;}</p>
<p>}<br><br>运行结果：<br>--------------- Staticinitialization ------------------<br>--------------- Call ------------------<br>--------------- Preinitialization ------------------<br>--------------- Initialization ------------------<br>-------------- Aspect Advice Logic Execution ---------------<br>In the advice picked by myClassConstructorWithIntAndOthersPointcut()<br>The current type of object under construction is: <br>getThis: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#109;&#46;&#101;&#114;&#105;&#99;&#46;&#97;&#115;&#112;&#101;&#99;&#116;&#106;&#46;&#77;&#121;&#67;&#108;&#97;&#115;&#115;&#64;&#49;&#48;&#100;&#52;&#52;&#56;">com.eric.aspectj.MyClass@10d448</a><br>getTarget: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#109;&#46;&#101;&#114;&#105;&#99;&#46;&#97;&#115;&#112;&#101;&#99;&#116;&#106;&#46;&#77;&#121;&#67;&#108;&#97;&#115;&#115;&#64;&#49;&#48;&#100;&#52;&#52;&#56;">com.eric.aspectj.MyClass@10d448</a><br>getKind: constructor-execution<br>Signature: com.eric.aspectj.MyClass(int, String)<br>getName: &lt;init&gt;<br>getDeclaringTypeName: com.eric.aspectj.MyClass<br>getDeclaringType: class com.eric.aspectj.MyClass<br>getModifiers: 1<br>Source Line: MyClass.java:8<br>toString: execution(com.eric.aspectj.MyClass(int, String))<br>--------------------------------------------------<br></p><img src ="http://www.blogjava.net/rain1102/aggbug/128095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-04 13:56 <a href="http://www.blogjava.net/rain1102/archive/2007/07/04/128095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AspectJ运行时API</title><link>http://www.blogjava.net/rain1102/archive/2007/07/04/128045.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jul 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/04/128045.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/128045.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/04/128045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/128045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/128045.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>AspectJ</span><span>运行时</span><span>API</span><span>的主要包包括</span><span>:</span></p>
<p><span>org.aspectj.lang—</span><span>提供了接口和支持类，用于发现关于连接点的运行时信息。</span></p>
<p><span>org.aspectj.lang.reflect—</span><span>包含一些接口，它们提供了关于连接点签名的更特殊化的信息。</span></p>
<p><span>org.aspectj.weaver.tools—</span><span>提供了一些接口，用于支持</span><span>JVM</span><span>类加载器执行加载时织入。</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/128045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-04 11:12 <a href="http://www.blogjava.net/rain1102/archive/2007/07/04/128045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>adviceexecution()切入点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/03/127903.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 03 Jul 2007 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/03/127903.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/127903.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/03/127903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/127903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/127903.html</trackback:ping><description><![CDATA[adviceexecution()切入点用于捕获在应用程序内执行任何通知的连接点。语法：<br>pointcut &lt;pointcut name&gt;() : adviceexecution();<br><br>public aspect AdviceExecutionRecipe {<br>&nbsp;pointcut adviceExecutionPointcut() : adviceexecution();<br>&nbsp;before() : adviceExecutionPointcut() &amp;&amp; !within(AdviceExecutionRecipe +) {<br>&nbsp;&nbsp;System.out.println("-------------- Aspect Advice Logic ---------------");<br>&nbsp;&nbsp;System.out.println("In the advice picked by ExecutionRecipe");<br>&nbsp;&nbsp;System.out.println("Signature: " + thisJoinPoint.getStaticPart().getSignature());<br>&nbsp;&nbsp;System.out.println("Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());<br>&nbsp;&nbsp;System.out.println("--------------------------------------------------");<br>&nbsp;}<br>}<img src ="http://www.blogjava.net/rain1102/aggbug/127903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-03 17:18 <a href="http://www.blogjava.net/rain1102/archive/2007/07/03/127903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>捕获异常处理上的连接点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/03/127884.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 03 Jul 2007 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/03/127884.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/127884.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/03/127884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/127884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/127884.html</trackback:ping><description><![CDATA[<p>使用handler(TypePattern)切入点。语法：<br>pointcut &lt;pointcut name&gt;(&lt;any values to be picked uo&gt;) : handler(&lt;class&gt;)&nbsp;;<br>handler(TypePattern)切入点只支持vbefore()形式的通知。这意味着不能使用像around()这样的通知来重写catch块的正常行为。<br><br>public aspect HandlerRecipe {<br>&nbsp;pointcut myExceptionHandlerPointcut() : handler(ServiceException);<br>&nbsp;before() : myExceptionHandlerPointcut() {<br>&nbsp;&nbsp;System.out.println("------------ Aspect Advice Logic --------------");<br>&nbsp;&nbsp;System.out.println("Signature: " + thisJoinPoint.getStaticPart().getSignature());<br>&nbsp;&nbsp;System.out.println("Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());<br>&nbsp;&nbsp;System.out.println("-----------------------------------------------");<br>&nbsp;}<br>}<br><br><br>public class ServiceException extends Exception {</p>
<p>&nbsp;/**<br>&nbsp; * Create a new ServiceException with the specified message.<br>&nbsp; * @param msg the detail message<br>&nbsp; */<br>&nbsp;public ServiceException(String msg) {<br>&nbsp;&nbsp;super(msg);<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * Create a new ServiceException with the specified message<br>&nbsp; * and root cause.<br>&nbsp; * @param msg the detail message<br>&nbsp; * @param ex the root cause<br>&nbsp; */<br>&nbsp;public ServiceException(String msg, Throwable ex) {<br>&nbsp;&nbsp;super(msg, ex);<br>&nbsp;}<br>}<br><br>public class ExceptionClass {</p>
<p>&nbsp;public void triggerMyException() throws ServiceException<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;ServiceException myException = new ServiceException("A service exception has occured");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("About to throw a ServiceException");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw myException;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;/**<br>&nbsp; * @param args<br>&nbsp; */<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;ExceptionClass myObject = new ExceptionClass();<br>&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myObject.triggerMyException();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ServiceException me)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("A ServiceException has been caught");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;}</p>
<p>}<br><br>运行结果：<br>About to throw a ServiceException<br>------------ Aspect Advice Logic --------------<br>Signature: catch(ServiceException)<br>Source Line: ExceptionClass.java:19<br>-----------------------------------------------<br>A ServiceException has been caught<br><br>获取抛出的异常<br>public aspect HandlerRecipe {<br>&nbsp;pointcut myExceptionHandlerPointcut(ServiceException exception) : handler(ServiceException) &amp;&amp; args(exception);<br>&nbsp;before(ServiceException exception) : myExceptionHandlerPointcut(exception) {<br>&nbsp;&nbsp;System.out.println("------------ Aspect Advice Logic --------------");<br>&nbsp;&nbsp;System.out.println("Signature: " + thisJoinPoint.getStaticPart().getSignature());<br>&nbsp;&nbsp;System.out.println("Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());<br>&nbsp;&nbsp;System.out.println("Exception caught:");<br>&nbsp;&nbsp;exception.printStackTrace();<br>&nbsp;&nbsp;System.out.println("-----------------------------------------------");<br>&nbsp;}<br>}<br><br></p><img src ="http://www.blogjava.net/rain1102/aggbug/127884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-03 16:32 <a href="http://www.blogjava.net/rain1102/archive/2007/07/03/127884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pointcut的要点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/03/127870.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 03 Jul 2007 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/03/127870.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/127870.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/03/127870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/127870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/127870.html</trackback:ping><description><![CDATA[1.起个有意义的名字<br>2.决定要匹配的种类:call、execution,<font face=新宋体>handler</font>, <tt><font face=新宋体>get</font></tt>, <tt><font face=新宋体>set</font></tt>, <tt><font face=新宋体>adviceexecution<br>3.决定要匹配的上下文：<font face=新宋体>target</font>, <tt><font face=新宋体>this</font></tt>, or <tt><font face=新宋体>args<br>4.决定要匹配的范围:within,withincode,cflow,cflowbelow<br>定义小的pointcut,由小的简单的pointcut构造复杂的pointcut</font></tt></font></tt><img src ="http://www.blogjava.net/rain1102/aggbug/127870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-03 15:56 <a href="http://www.blogjava.net/rain1102/archive/2007/07/03/127870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>this,target,args与call,execution区别</title><link>http://www.blogjava.net/rain1102/archive/2007/07/03/127869.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 03 Jul 2007 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/03/127869.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/127869.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/03/127869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/127869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/127869.html</trackback:ping><description><![CDATA[this,target,args均为运行时类型检查,包括该类型的子类,有两种用法：<br>a. this( Type),target(Type),args(Type)只判断是否是Type类型<br>b. this(id),target(id),args(id):id是Type类型且绑定pointcut中的声明<br>call,execution均为静态类型检查。<img src ="http://www.blogjava.net/rain1102/aggbug/127869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-03 15:53 <a href="http://www.blogjava.net/rain1102/archive/2007/07/03/127869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用execution(Signature)切入点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/03/127864.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 03 Jul 2007 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/03/127864.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/127864.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/03/127864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/127864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/127864.html</trackback:ping><description><![CDATA[<p>execution(Signature)切入点的语法是：<br>pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : execution(&lt;optional&nbsp; modifier&gt; &lt;return type&gt; &lt;class&gt;.&lt;method&gt;(&lt;parameter types&gt;)); <br>它与call(Signature)切入点类似，但重要的区别是：在什么地方调用通知，以及它的环境是什么？<br>就call(Signature)切入点来说，在调用方法的地方调用通知。调用通知的环境是调用类。一旦进入方法，因而调用的环境是正在执行的方法时，就会调用execution(Signature)切入点。<br>另外：call(Signature)切入点和execution(Signature)切入点在捕获继承和/或重写（依赖于对象的静态和动态类型）的对象方法上的连接点时它们有一些奇怪的行为。<br>&nbsp;<br>package com.eric.aspectj;</p>
<p>public aspect MyAspectj {<br>&nbsp;pointcut callPointCut(My myClass, int age, String name) : execution(void com.eric.aspectj.My.foo(int, String)) &amp;&amp; this(myClass) &amp;&amp; args(age, name);<br>&nbsp;before(My myClass, int age, String name) : callPointCut(myClass, age, name) {<br>&nbsp;&nbsp;System.out.println("signature: " + thisJoinPoint.getStaticPart().getSignature());<br>&nbsp;&nbsp;System.out.println("Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());<br>&nbsp;&nbsp;System.out.println("before...name : " + name + " age : " + age);<br>&nbsp;}<br>&nbsp;after(My myClass, int age, String name) returning: callPointCut(myClass, age, name) {<br>&nbsp;&nbsp;System.out.println("after...");<br>&nbsp;}<br>}</p><img src ="http://www.blogjava.net/rain1102/aggbug/127864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-03 15:38 <a href="http://www.blogjava.net/rain1102/archive/2007/07/03/127864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用call(Signature)切入点</title><link>http://www.blogjava.net/rain1102/archive/2007/07/03/127855.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 03 Jul 2007 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/03/127855.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/127855.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/03/127855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/127855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/127855.html</trackback:ping><description><![CDATA[<p>call(Signature)切入点的语法是：<br>pointcut &lt;pointcut name&gt;(&lt;any values to be picked up&gt;) : call(&lt;optional&nbsp; modifier&gt; &lt;return type&gt; &lt;class&gt;.&lt;method&gt;(&lt;parameter types&gt;));<br><br>package com.eric.aspectj;</p>
<p>public aspect MyAspectj {<br>&nbsp;pointcut callPointCut(MyClass myClass, int age, String name) : call(void com.eric.aspectj.MyClass.foo(int, String)) &amp;&amp; target(myClass) &amp;&amp; args(age, name);<br>&nbsp;before(MyClass myClass, int age, String name) : callPointCut(myClass, age, name) {<br>&nbsp;&nbsp;System.out.println("before...name : " + name + " age : " + age);<br>&nbsp;}<br>&nbsp;after(MyClass myClass, int age, String name) returning: callPointCut(myClass, age, name) {<br>&nbsp;&nbsp;System.out.println("after...");<br>&nbsp;}<br>}</p>
<p><br>package com.eric.aspectj;</p>
<p>public class MyClass {</p>
<p>&nbsp;public void foo(int age, String name) {<br>&nbsp;&nbsp;System.out.println("foo " + name + " age is " + age);<br>&nbsp;}<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;MyClass object = new MyClass();<br>&nbsp;&nbsp;object.foo(24, "Eric Chau");<br>&nbsp;}<br>}<br><br>运行结果：<br>before...name : Eric Chau age : 24<br>foo Eric Chau age is 24<br>after...</p><img src ="http://www.blogjava.net/rain1102/aggbug/127855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-03 15:10 <a href="http://www.blogjava.net/rain1102/archive/2007/07/03/127855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>