Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] NoSuchMethod Exception with aspected Code !

Given the different bytecode names for the advice, perhaps
make sure the aspect class is the one produced when you weave
the input jars.  If you reuse the aspect, a better way to
build would be to compile the aspect first, and then put it
on the aspectpath when compiling each client, and on the
runtime classpath.

Otherwise, perhaps the NoSuchMethodError was caused by failing
to load the aspect.  Try setting up the classpath as usual, but
just running some code[1] that refers to the aspect directly
and has no aspects associated with it, e.g.,

  ... {some method}.. {
      System.out.println("aspect class: " + Test.class.getName());
  }

If that fails, it's a classpath problem (the aspect or
the aspectj runtime classes are not visible from the classloader
that loaded the target class).

Wes

[1] Best to compile this with javac, with aspect on the classpath.

ravi varanasi wrote:

Hi All,
I have encounter a weird problem while aspecting a jar file. Following is the background to the problem :- Name of my aspect is: Test.java. Command to weave the input jar with the aspect: ajc -injars input.jar -outjar out.jar Test.java One of the classes which met the criteria for JoinPoint has been modified by the ajc and written to the out.jar. Following is the piece of code from the aspect weaved class (generated using a decompiler) :- public Object getAttribute(String arg0)
    {
        Test.aspectOf().ajc$before$first_aspect_Test$5aa(ajc$tjp_0);
        HTTPLogger.logUnableToDeserializeNamedAttribute(getLogContext(), arg0, runtimeexception);
        attributes.remove(arg0);
        return null;
        Exception exception;
        exception;
        Test.aspectOf().ajc$afterThrowing$first_aspect_Test$3d5(exception);
        throw exception;
    }

Please note the calls Test.aspectOf().ajc$before$first_aspect_Test$5aa(ajc$tjp_0); and Test.aspectOf().ajc$afterThrowing$first_aspect_Test$3d5(exception); inserted by the ajc in the original method getAttribute(String). These methods ajc$before$first_aspect_Test$5aa(ajc$tjp_0); & ajc$afterThrowing$first_aspect_Test$3d5(exception); are not there in the Test.class.
Following is the method signature map of my aspect Test.java (generated using javap):

public class first.aspect.Test extends java.lang.Object {
    public static java.lang.String methodName;
    public static final first.aspect.Test ajc$perSingletonInstance;
    static {};
    public void setMethodName(java.lang.String);
    public java.lang.String getMethodName();
    public first.aspect.Test();
    public void ajc$before$first_aspect_Test$3d5(org.aspectj.lang.JoinPoint$Stat
icPart);
    public static first.aspect.Test aspectOf();
    public static boolean hasAspect();
}


My program fails with java.lang.NoSuchMethodError: first.aspect.Test.ajc$before$first_aspect_Test$5aa(Lorg/aspectj/lang/JoinPoint$StaticPart;)V exception when I try to execute. Any suggestions, why this is happening? Is this a bug or I am doing something wrong???
Following is the Test.java source:

package first.aspect;

public aspect Test {

  public Test() {
    System.out.println("Constructor: Test");
  }

  pointcut callWLServlet() : execution ( * weblogic.servlet..*.*(..) );
  pointcut callServlet() : execution ( * javax.servlet..*.*(..) );

  pointcut excludeInternal() : execution ( * weblogic.management.internal..*.*(..) );
  pointcut excludeTools() : execution ( * weblogic.management.tools..*.*(..) );
  pointcut excludeInfo() : execution ( * weblogic.management.info..*.*(..) );

  after() throwing (Exception npe) :(
         callServlet() &&
         callWLServlet() &&
        (!excludeInternal()) &&
        (!excludeTools()) &&
        (!excludeInfo())
        ) {
          System.out.println("Logging exception using Aspect: ");
          System.out.println("=============================== ");
          System.out.println("Message: " + npe.getMessage() );
          System.out.println("=============================== ");
  }

  before() : ( callServlet() &&
               callWLServlet() &&
               ( ! excludeInternal() ) &&
               ( ! excludeTools() ) &&
               ( ! excludeInfo() )
             ) {

      if ( methodName.equals( thisJoinPoint.getSignature().getName() ) ) {
        System.out.println("---------> Matched call: " + methodName );
        throw new NullPointerException("Aspected Exception");
      } else {
        //System.out.println("========> Method call: " + thisJoinPoint.getSignature().getName() + " <=========");
      }
  }
}
Thanks,

Ravi Varanasi

408 394 3273




Back to the top