[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] generate a StackTraceElement
|
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[quote Wes Isberg::on 2/10/2005 10:23 PM]
|
|> | You can't bind the JoinPoint available in advice this way.
|> |
|> Why not? I think I have even read about this in one of AJ book
|
| Ok, I should have said "shouldn't" not "can't".
|
| You can't, or shouldn't, because we (intentionally) haven't
| documented in the programming guide the order or contents
| of advice parameters.
I have noticed that these are not documented. However, if I correctly used the pointcuts i have
expressed the following: match any joinpoint that occurs during the execution of an advice which has
a JoinPoint parameter. What I am missing?
- --
:alex |.::the_mindstorm::.|
By experiment you might find different
| behaviors for different join points, different compiler
| options, and different versions or implementations of
| the compiler/weaver.
|
| If you want to print any available JoinPoint|StaticPart argument,
| you can do that with the code below. It's a bit like looking
| at the bytecode methods that implement advice: neat, but I
| wouldn't rely on it for real code.
|
| Wes
|
| P.S. -
|> Why not? I think I have even read about this in one of AJ book
|> (Cookbook?).
|
| I can't speak to the cookbook; I haven't read it. I would
| hope/expect that the cookbook gave similar caveats when
| presenting it. If a language feature is not in the
| programming guide, developers are at their peril to rely on it.
|
| ---------------- bugs/Main.java
| package bugs;
|
| import org.aspectj.lang.JoinPoint;
| import org.aspectj.lang.Signature;
| import org.aspectj.lang.reflect.SourceLocation;
|
| import util.IAspect;
|
| /**
| */
| public class Main {
|
| public static void main(String[] args) {
| }
| }
| aspect A implements IAspect {
| before() : within(Main) {
| System.out.println("before() " + thisJoinPointStaticPart);
| }
| }
| aspect B implements IAspect {
| before() : adviceexecution() && !within(B) {
| if (!logAdvisedJoinPoint(thisJoinPoint.getArgs())) {
| logThisJoinPoint(-1, thisJoinPointStaticPart);
| }
| }
| boolean logAdvisedJoinPoint(Object[] args) {
| boolean logged = false;
| for (int i = 0; !logged && (i < args.length); i++) {
| if (args[i] instanceof JoinPoint) {
| logThisJoinPoint(i,
| ((JoinPoint) args[i]).getStaticPart());
| return true;
| } else if (args[i] instanceof JoinPoint.StaticPart) {
| logThisJoinPoint(i,
| (JoinPoint.StaticPart) args[i]);
| return true;
| }
|
| }
| return false;
| }
| void logThisJoinPoint(int index, JoinPoint.StaticPart jp) {
| Signature sig = jp.getSignature();
| SourceLocation loc = jp.getSourceLocation();
| StackTraceElement ste = new StackTraceElement
| (sig.getDeclaringType().getName(), sig.getName(),
| loc.getFileName(), loc.getLine());
| print((-1<index? "advisee " : " advice ")
| + index + ": " + ste);
| }
| void print(String s) {
| System.out.print(s + "\n");
| }
| }
|
|
|>
|> - --
|> :alex |.::the_mindstorm::.|
|>
|> | The code below works, logging all the adviceexecution
|> | join points.
|> |
|> | Valerio, do you instead want to log the join points being
|> | advised by the advice (in Main below, staticinitialization
|> | and method-execution)? If the pointcuts were named and
|> | enumerable, you could do that, but it's awkward. What's
|> | the use-case for this? Does the variable
|> | thisEnclosingJoinPointStaticPart help?
|> |
|> | Wes
|> |
|> | ------------------ bug/Main.java
|> | package bugs;
|> |
|> | import org.aspectj.lang.JoinPoint;
|> | import org.aspectj.lang.Signature;
|> | import org.aspectj.lang.reflect.SourceLocation;
|> |
|> | /**
|> | */
|> | public class Main {
|> |
|> | public static void main(String[] args) {
|> | }
|> | }
|> | aspect A {
|> | before() : within(Main) {
|> | System.out.println("before() "
|> | + thisJoinPointStaticPart);
|> | }
|> | }
|> | aspect B implements IAspect {
|> | before() : adviceexecution() && !within(B) {
|> | log(thisJoinPointStaticPart);
|> | }
|> | void log(JoinPoint.StaticPart jp) {
|> | Signature sig = jp.getSignature();
|> | SourceLocation loc = jp.getSourceLocation();
|> | StackTraceElement ste = new StackTraceElement
|> | (sig.getDeclaringType().getName(), sig.getName(),
|> | loc.getFileName(), loc.getLine());
|> | System.out.println("BeforeAndAfter advice: "+ ste);
|> | }
|> | }
|> |
|> |
|> |
|> |> ------------Original Message------------
|> |> From: Alexandru Popescu <alexandru.popescu@xxxxxxxxx>
|> |> To: aspectj-users@xxxxxxxxxxx
|> |> Date: Thu, Feb-10-2005 10:16 AM
|> |> Subject: Re: [aspectj-users] generate a StackTraceElement
|> |>
|> | [quote Valerio Schiavoni::on 2/10/2005 6:44 PM]
|> | | On Thursday 10 February 2005 16:29, Alexandru Popescu wrote:
|> | |> The only available pointcut related to aspects is the
|> | adviceexecution() but
|> | |> you cannot refine it further to match a before advice and after
|> | advice.
|> | |
|> | | i don't need to refine it. It'd be enough to be able to "dump" the
|> | stack
|> | | everytime an advice is executed.
|> | |
|> | | i tried with :
|> | |
|> | | pointcut Advices(): adviceexecution() && within(TraceAspect);
|> | |
|> | | after(): Advices() {
|> | | StackTraceElement ste = new StackTraceElement
|> | | (thisJoinPoint.getSignature().getDeclaringType().getName(),
|> | | thisJoinPoint.getSignature().getName(),
|> | | thisJoinPoint.getSourceLocation().getFileName(),
|> | | thisJoinPoint.getSourceLocation().getLine());
|> | | System.out.println("BeforeAndAfter advice: "+ ste);
|> | | }
|> | |
|> | | so, if another advice is present, i want to get info about that
|> join
|> | point.
|> | | This is not possible? If so...why ?
|> | |
|> | | thanks,
|> | | valerio
|> |
|> | I think what you are looking for is something in this direction:
|> |
|> | pointcut advices(JoinPoint jp): adviceexecution() && args(jp) &&
|> | within(...)
|> |
|> | --
|> | :alex |.::the_mindstorm::.|
|> _______________________________________________
|> aspectj-users mailing list
|> aspectj-users@xxxxxxxxxxx
|> http://dev.eclipse.org/mailman/listinfo/aspectj-users
|>
|> | _______________________________________________
|> | aspectj-users mailing list
|> | aspectj-users@xxxxxxxxxxx
|> | http://dev.eclipse.org/mailman/listinfo/aspectj-users
|>
|>
|> -----BEGIN PGP SIGNATURE-----
|> Version: GnuPG v1.4.0 (MingW32)
|>
|> iD8DBQFCC7i5TTDTje0R2dgRAp2cAJ9aXgpux84+BDEsNCFrvFbqPnqgRACaAwgh
|> lEQpjClpH6nDezCBm6ZM58Q=
|> =Ri8P
|> -----END PGP SIGNATURE-----
|> _______________________________________________
|> aspectj-users mailing list
|> aspectj-users@xxxxxxxxxxx
|> http://dev.eclipse.org/mailman/listinfo/aspectj-users
|>
|
|
| _______________________________________________
| aspectj-users mailing list
| aspectj-users@xxxxxxxxxxx
| http://dev.eclipse.org/mailman/listinfo/aspectj-users
|
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)
iD8DBQFCC84LTTDTje0R2dgRAjdtAJ4lwNsGD4PKrJJ3EwzXGoeU6GmtHgCcDbZt
FlVkbO2MdToGExKvMhyu2z8=
=LLgm
-----END PGP SIGNATURE-----