Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] Exposing state held in method annotations

I've been using the following (ugly) code due to lack
of binding support in M1:

pointcut constantArgumentMethods(int[] value) :
call(@ConstantArguments(value) * *.*(..));

before(..) : constantArgumentMethods(..) {
  Signature sig =
thisJoinPointStaticPart.getSignature();
  Class c = sig.getDeclaringType();
  MethodSignature msig =
((MethodSignature)thisJoinPointStaticPart).getSignature();
  Method m = c.getMethod(sig.getName(),
sig.getParameterTypes());

  ConstantArguments = (ConstantArguments)
m.getAnnotation(ConstantArguments.class);

---do something with the annotation---

}

 --- Ted Neward <ted@xxxxxxxxxx> escribió: 
> First time I run the sample code, I get a
> NoSuchMethodError when trying to
> pull back the "m" method, because it's not public
> and therefore needs the
> setAccessible(true) call, or changing "m" to public
> (which is what I did).
> Doing so (and printing the return value from
> getMethodAnnotation) prints
> "1", indicating that method annotations *are*
> preserved in the .class.
> 
> Hate to say it, Wes, but it was the example that was
> broken this time. :-)
> 
> Ted Neward
> Author, Instructor, Consultant
> Java, .NET, Web services
> http://www.neward.net/ted
> 
> > -----Original Message-----
> > From: aspectj-users-admin@xxxxxxxxxxx
> [mailto:aspectj-users-
> > admin@xxxxxxxxxxx] On Behalf Of Wes Isberg
> > Sent: Thursday, January 27, 2005 12:52 PM
> > To: aspectj-users@xxxxxxxxxxx
> > Subject: Re: [aspectj-users] Exposing state held
> in method annotations
> > 
> > Hi Eric -
> > 
> > > But how can I expose the "value" state "{1}"
> that I passed in above?
> > > The following does *not* work:
> > >
> > > pointcut constantArgumentMethods(int[] value) :
> > > call(@ConstantArguments(value) * *.*(..));
> > 
> > @withincode() should surface a method annotation,
> but 1.5.0M1
> > doesn't yet support binding (and also fails to
> compile when a
> > literal type is used).
> > 
> > Java 5 should permit you to reflectively read the
> annotation on a method.
> > Code for that is below, but looks broken: when
> annotations are added
> > to methods, they no longer are returned by
> Class.getMethod*(..)
> > (true of both javac and jdt, so my code could be
> wrong - corrections?)
> > 
> > See the developer's notebook section on runtime
> matching and context
> > exposure for annotations:
> >
>
http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-
> >
>
home/doc/ajdk15notebook/annotations-pointcuts-and-advice.html#d0e1169
> > 
> > Wes
> > 
> >
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=83875
> > 
> > ------------ misc/MAI.java
> > package misc;
> > 
> > import java.lang.reflect.Method;
> > import java.lang.annotation.*;
> > import java.util.Arrays;
> > 
> > /**
> >  * MAI: method annotation instance
> >  */
> > public class MAI {
> > 
> >     public static void main(String[] args) {
> >     	m();
> >     	getMethodAnnotation();
> >     }
> > 
> >     @CConstantArguments(id=1)
> >     static void m() {
> >         System.out.println("in m()");
> >     }
> > 
> >     static int getMethodAnnotation() {
> >     	try {
> >         	Class c = MAI.class;
> >         	Method[] ms = c.getMethods();
> >         	System.out.println("" +
> Arrays.asList(ms));
> >         	Method m = c.getMethod("m", new
> Class[0]);
> >         	CConstantArguments ca =
> > m.getAnnotation(CConstantArguments.class);
> >     		return (null == ca ? -1 : ca.id());
> >     	} catch (Exception e) {
> >     		throw new Error(e);
> >     	}
> >     }
> > }
> > @Retention(RetentionPolicy.RUNTIME)
> > @interface CConstantArguments {
> >    int id();
> > }
> > 
> > 
> > > ------------Original Message------------
> > > From: Eric Bodden <eric@xxxxxxxxx>
> > > To: aspectj-users@xxxxxxxxxxx
> > > Date: Thu, Jan-27-2005 10:26 AM
> > > Subject: [aspectj-users] Exposing state held in
> method annotations
> > >
> > >
> > > -----BEGIN PGP SIGNED MESSAGE-----
> > > Hash: SHA1
> > >
> > > Hi all.
> > >
> > > Today I came across an annotation problem which
> I don't know how to
> > > solve:
> > >
> > > I have a method annotated like this:
> > >
> > > @ConstantArguments({1}) public int foo(Wrapper
> a) {
> > > ..
> > > }
> > >
> > > Now I am matching on calls to it like this:
> > >
> > > pointcut constantArgumentMethods() :
> call(@ConstantArguments *
> > > *.*(..));
> > >
> > > But how can I expose the "value" state "{1}"
> that I passed in above?
> > > The following does *not* work:
> > >
> > > pointcut constantArgumentMethods(int[] value) :
> > > call(@ConstantArguments(value) * *.*(..));
> > >
> > > I guess @target will not help, since it returns
> annotations of the
> > > target *type*, not *method*, or am I wrong?
> > >
> > > Cheers,
> > > Eric
> > >
> > > P.S. Definition of the ynnotation type:
> > >
> > > public @interface ConstantArguments {
> > >
> > >     int[] value() default {};
> > >
> > > }
> > >
> > > - --
> > > Eric Bodden
> > > Chair I2 for Programming Languages and Program
> Analysis
> > > RWTH Aachen University
> > >
> > > -----BEGIN PGP SIGNATURE-----
> > > Version: PGP 8.0.3
> > >
> > >
>
iQA/AwUBQfkyNMwiFCm7RlWCEQJUvwCdF6oPnnOj0IOrwgK3oqBFsEG+f+EAn1lW
> > > n+BcQ4OfJRo3KlGuMlt7q+3Y
> > > =IJhX
> > > -----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
> 
> 
> 
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
>
http://dev.eclipse.org/mailman/listinfo/aspectj-users
>  


		
______________________________________________ 
Renovamos el Correo Yahoo!: ¡250 MB GRATIS! 
Nuevos servicios, más seguridad 
http://correo.yahoo.es


Back to the top