Reflection and Annotation-arguments

G

grz01

Hi again,

Another reflection question...

I can get at the annotations of a class by doing something like:

import java.lang.annotation.Annotation
...
Bean bean = new Bean();
Annotation a = bean.getClass().getAnnotations()[0];

But if the Annotation has parameters, like

@Table(name="FOOBAR")
public class Bean{ ... }

how do I extract the argument here (i e: name = "FOOBAR") ?

Looking at the java.lang.annotation.Annotation class, I dont see any
method for this?

TIA / grz01
 
M

Mayeul

grz01 said:
Hi again,

Another reflection question...

I can get at the annotations of a class by doing something like:

import java.lang.annotation.Annotation
...
Bean bean = new Bean();
Annotation a = bean.getClass().getAnnotations()[0];

But if the Annotation has parameters, like

@Table(name="FOOBAR")
public class Bean{ ... }

how do I extract the argument here (i e: name = "FOOBAR") ?

Looking at the java.lang.annotation.Annotation class, I dont see any
method for this?

That is because annotations extend the java.lang.annotation.Annotation
interface, and declare by themselves the parameters they accept, in the
form of parameterless methods.

Since your Table annotation accepts a 'name' parameter, it defines at
least a name() method, which probably returns a String.
You need to cast your Annotation object to Table and call this name()
method on it.

You can call the annotationType() method if you're not sure what to cast
your Annotation to. It is also possible to inspect the methods provided
by annotation classes, and to get an annotation's parameters values by
invoking those methods on an Annotation object.

Examples



Annotation a = bean.getClass().getAnnotations()[0];
Table table = (Table)a;
String name = table.name();
System.out.println(name); // Should display FOOBAR


Other example: (couldn't find a better way to ignore equals() and so
methods, really not Google's friend, and curious to learn)

Annotation a = bean.getClass().getAnnotations()[0];
for(Method method : a.getClass().getDeclaredMethods()) {
String paramName = method.getName().intern();
if("equals" != paramName && "hashCode" != paramName &&
"toString" != paramName && "annotationType" != paramName) {
Object param = method.invoke(a);
System.out.println(paramName + ": " + param);
}
}
// Should display at least 'name: FOOBAR'
 
A

Arved Sandstrom

grz01 said:
Hi again,

Another reflection question...

I can get at the annotations of a class by doing something like:

import java.lang.annotation.Annotation
...
Bean bean = new Bean();
Annotation a = bean.getClass().getAnnotations()[0];

But if the Annotation has parameters, like

@Table(name="FOOBAR")
public class Bean{ ... }

how do I extract the argument here (i e: name = "FOOBAR") ?

Looking at the java.lang.annotation.Annotation class, I dont see any
method for this?

TIA / grz01
The Annotation class in and of itself is not useful here. Discover your
class/method/parameter etc annotations using the methods in java.lang.Class.

AHS
 
G

grz01

grz01 said:
Hi again,
Another reflection question...
I can get at the annotations of a class by doing something like:
    import java.lang.annotation.Annotation
    ...
    Bean bean = new Bean();
    Annotation a = bean.getClass().getAnnotations()[0];
But if the Annotation has parameters, like
   @Table(name="FOOBAR")
   public class Bean{ ... }
how do I extract the argument here (i e: name = "FOOBAR") ?
Looking at the java.lang.annotation.Annotation class, I dont see any
method for this?

That is because annotations extend the java.lang.annotation.Annotation
interface, and declare by themselves the parameters they accept, in the
form of parameterless methods.

Since your Table annotation accepts a 'name' parameter, it defines at
least a name() method, which probably returns a String.
You need to cast your Annotation object to Table and call this name()
method on it.

You can call the annotationType() method if you're not sure what to cast
your Annotation to. It is also possible to inspect the methods provided
by annotation classes, and to get an annotation's parameters values by
invoking those methods on an Annotation object.

Examples

Annotation a = bean.getClass().getAnnotations()[0];
Table table = (Table)a;
String name = table.name();
System.out.println(name); // Should display FOOBAR

Other example: (couldn't find a better way to ignore equals() and so
methods, really not Google's friend, and curious to learn)

Annotation a = bean.getClass().getAnnotations()[0];
for(Method method : a.getClass().getDeclaredMethods()) {
   String paramName = method.getName().intern();
   if("equals" != paramName && "hashCode" != paramName &&
     "toString" != paramName && "annotationType" != paramName) {
     Object param = method.invoke(a);
     System.out.println(paramName + ": " + param);
   }}

// Should display at least 'name: FOOBAR'

I see, very helpful.
Thanks Mayeul!
 
D

Daniel Pitts

Mayeul said:
grz01 said:
Hi again,

Another reflection question...

I can get at the annotations of a class by doing something like:

import java.lang.annotation.Annotation
...
Bean bean = new Bean();
Annotation a = bean.getClass().getAnnotations()[0];

But if the Annotation has parameters, like

@Table(name="FOOBAR")
public class Bean{ ... }

how do I extract the argument here (i e: name = "FOOBAR") ?

Looking at the java.lang.annotation.Annotation class, I dont see any
method for this?

That is because annotations extend the java.lang.annotation.Annotation
interface, and declare by themselves the parameters they accept, in the
form of parameterless methods.

Since your Table annotation accepts a 'name' parameter, it defines at
least a name() method, which probably returns a String.
You need to cast your Annotation object to Table and call this name()
method on it.

You can call the annotationType() method if you're not sure what to cast
your Annotation to. It is also possible to inspect the methods provided
by annotation classes, and to get an annotation's parameters values by
invoking those methods on an Annotation object.

Examples



Annotation a = bean.getClass().getAnnotations()[0];
Table table = (Table)a;
String name = table.name();
System.out.println(name); // Should display FOOBAR

Generally, you ask for an annotation by type, rather than look at the
available annotations:

Table table = bean.getClass().getAnnotation(Table.class);
System.out.println(table.name());

If you don't know the type before hand, then you can use reflection on
the returned object to get the public methods, and call those.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,480
Members
44,900
Latest member
Nell636132

Latest Threads

Top