Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Joinpoint method signature matches superclass and not the referenced class

Hi Steve,

The problem is that the signature at the C.doIt() method call matches *both* the method declaration on C and the method declaration on IC.

http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html#signatures

So, the pointcut is behaving as spec-ed.

Because of how method call signatures are matched, I do not think it is possible to do exactly what you want using declare warning only.

However, you can try doing this using a before advice:

before() : !@target(PublicAPI) && (call(* (!@PublicAPI *).*())) {
        throw new RuntimeException("Non public API usage");
}

Notice how this becomes a runtime test.  This will look at the concrete type of the target at runtime and throw an exception if it does not have the annotation.

eg-

interface IC
@PublicAPI class C implements IC
class D extends C

IC ic = new C();
ic.doIt();  // OK!   with gutter marker signifying runtime test
ic = new D();
ic.doIt(); // Exception!!! with gutter marker signifying runtime test

This is the best I can do.  Can anyone else do better?

Feel free to raise an enhancement request for your particular situation.


On Tue, Jun 23, 2009 at 8:01 AM, Steve reds <stevebread@xxxxxxxxx> wrote:

Hi Oliver, its not the constructor because if I have another class

@PublicAPI
class B
{
   public void doIt() {
   }
}

and call
new B().doIt();

that does not give me a warning.

I can even have
@PublicAPI
class B implements IB
{
   public void doIt() {
   }
}

public interface IB
{
}

and that does not give a warning.

Thanks,
Steve

--- On Tue, 6/23/09, Oliver Böhm <boehm@xxxxxxxxxx> wrote:

> From: Oliver Böhm <boehm@xxxxxxxxxx>
> Subject: Re: [aspectj-users] Joinpoint method signature matches superclass and not the referenced class
> To: aspectj-users@xxxxxxxxxxx
> Date: Tuesday, June 23, 2009, 7:09 AM
> Hello Steve,
>
> I guess, it is the constructor call "new C()" who causes
> the warning, because it has no annotation.
>
> rggards
> Oliver
>
>
>
> Steve reds schrieb:
> > Hi, I'm having trouble creating a method signature and
> I wonder if it is FaD.
> >
> > I'm trying to create a pattern for 'declare warning'
> that identifies all method calls to classes that do not have
> the annotation - @PublicAPI. The annotation is on the
> referenced class, not its methods.
> >
> > The pattern I am using is:
> > declare warning : call(* (!@PublicAPI *).*(..)) : "Non
> public API usage";
> >
> > In the following case I don't expect a warning but one
> is generated:
> >
> > public class Main
> > {
> >     public static void
> main(String[] args) {
> >         // Generates
> warning even though C is @PublicAPI
> >         new C().doIt();
> >     }
> > }
> >
> > @PublicAPI
> > class C implements IC
> > {
> >     public void doIt() {
> >     }
> > }
> >
> > public interface IC
> > {
> >     public void doIt();
> > }
> >
> > Shouldn't the signature match doIt() in C and not the
> one in IC since only C is referenced in Main?
> >
> > Thanks,
> > Steve
> >
> >
> >   
>    _______________________________________________
> > aspectj-users mailing list
> > aspectj-users@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
> -- Oliver Böhm
> http://www.javatux.de
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top