More information

   - The part of the code that’s causing the exception - this is decompiled
   from the woven .class file:

public class TThreadPoolServer {

    public void serve() {

  . . .

  TThreadPoolServer.WorkerProcess var13;

  TThreadPoolServer.WorkerProcess var10000 = var13 = new

  TThreadPoolServer.WorkerProcess(client, (<undefinedtype>)var10);

  // The exception says here afterReturning throws the exception


  
EpredRunnablesCallables.aspectOf().ajc$afterReturning$EpredRunnablesCallables$1$8a935d86(var13);

  . . .

  }

 // inner class
  private class WorkerProcess implements Runnable,
InstrumentedRunnableCallable {
        public long myid; // inserted by aspectj

        . . .

    }

}


   - Question: how does pertypewithin() work? what’s its scope?

For example, pertypewithin(Runnable+) - does it work every class in the
classpath, even including those in rt.jar? When does it create instance for
every class that implements Runnable (after class loading, on demand, …)?

Thank you!



On May 17, 2018 at 4:36:23 PM, Yongle Zhang ([email protected]) wrote:

Hi,
Problem

I have some aspects trying to insert an ID for every class that implements
Runnable.

My aspects (provided below) works fine for a simple test in which 1) I
wrote my own MyRunnable class implementing Runnable, 2) I have a simple
main function that creates and runs a thread using MyRunnable.

However, when I use it to instrument apache thrift library, it gives me
org.aspectj.lang.NoAspectBoundException exception.

I use compile-time weaving. The compile-time weaving finishes successfully,
and the instrumented .class code shows the aspects was woven. However,
running the instrumented apache thrift lib gives this excetpion:

(MyServer is my simple server implementation using thrift.
TThreadPoolServer is the server class in apache thrift lib.)

org.aspectj.lang.NoAspectBoundException
    at EpredPerRunnable.aspectOf(EpredPerRunnable.aj:1)
    at 
EpredRunnablesCallables.ajc$afterReturning$EpredRunnablesCallables$1$8a935d86(EpredRunnablesCallables.aj:55)
    at 
org.apache.thrift.server.TThreadPoolServer.serve(TThreadPoolServer.java:168)
    at MyServer.StartsimpleServer(MyServer.java:21)
    at MyServer.main(MyServer.java:28)

My Aspects

Here are the aspects I wrote:

1) I have a counter for each class implements Runnable using pertypewithin.

privileged aspect PerRunnable
    pertypewithin(java.lang.Runnable+)
{
  public long counter = 0;

  public long getCounter() {
    return counter;
  }

  public void incrementCounter() {
    counter++;
  }
}

2) I insert an id into each class that implements Runnable using interface.

privileged aspect MyRunnables {

  public interface InstrumentedRunnable {}

  private long InstrumentedRunnable.myid = -1;

  public long InstrumentedRunnable.getMyid() {
    return myid;
  }

  public void InstrumentedRunnable.setMyid(long id) {
    myid = id;
  }


  declare parents: (Runnable)+ implements InstrumentedRunnable;

  after() returning(InstrumentedRunnable r):
      call(java.lang.Runnable+.new(..)) {

      long id = PerRunnable.aspectOf(r.getClass()).getCounter();
      r.setMyid(id);

      PerRunnable.aspectOf(r.getClass()).incrementCounter();

  }

}

3) Part of my scripts that only instruments thrift:

CLASSPATH=$CLASSPATH:~/aspectj1.9/lib/aspectjtools.jar
CLASSPATH=$CLASSPATH:~/aspectj1.9/lib/aspectjrt.jar
AJC=~/aspectj1.9/bin/ajc

echo "Compiling Aspects ..."
$AJC -classpath $CLASSPATH:./lib/libthrift-0.11.0.jar -source 1.8 asp/*.aj

echo "Weaving aspect into thrift lib..."
$AJC -classpath
$CLASSPATH:./lib/servlet-api-2.5.jar:./lib/httpcore-4.4.1.jar:./lib/slf4j-api-1.7.12.jar:./lib/httpclient-4.4.1.jar
-source 1.8 -inpath ./lib/libthrift-0.11.0.jar -aspectpath ./asp/
-outjar ./my-libthrift-0.11.0.jar


4) Part of my scripts that starts the thrift server:

CLASSPATH=$CLASSPATH:~/aspectj1.9/lib/aspectjtools.jar
CLASSPATH=$CLASSPATH:~/aspectj1.9/lib/aspectjrt.jar

java -cp 
$CLASSPATH:./asp:./my-add-server.jar:./my-libthrift-0.11.0.jar:./lib/slf4j-api-1.7.12.jar
MyServer

Need Help

   1. Has anyone met such problem before? Any guess? Note that these
   aspects works for my own Runnable but not for thrift lib. (I can send more
   code needed including my test classes and my scripts, but they don’t fit
   within an email…)
   2. Is there a way to get all aspect instances and what they are matched
   to at runtime?
   3. Does aspectj has this feature: given 1) a pointcut, 2) the signature
   of a target (class/method) I want the pointcut to match, tell me whether
   they matched, and if not why.

Thank you for your time and help!
_______________________________________________
aspectj-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to