[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
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
>