[
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