user7819089
user7819089

Reputation:

JAVA : How to get the name of variable with annotation in Java?

I am trying to get the name of variable in android using java.

The variable has a annotation, and I want to get the variable's name with the annotation's name. is this possible?

just like this,

@getnameofthisfield
private String name;

use getnameofthisfield and get name

Upvotes: 0

Views: 2041

Answers (4)

Mike
Mike

Reputation: 653

This comes up when you have a Data holder class that is a model for Firebase fields (for example) and the spelling of the member names must exactly equal the Strings in the Firebase tree. While I have not eliminated the duplicate typing/spelling of the Strings/fields, this will at least detect these programming errors at run-time.

public class User {

    private String email;
    private String name;

    // avoid out-of-sync String names of fields in other files
    public static String getFieldName(String fieldRequest) {
        try {
            return User.class.getDeclaredField(fieldRequest).getName();
        } catch (NoSuchFieldException e1) {
            e1.printStackTrace();
            throw new RuntimeException("Unrecognized field in " 
               + User.class.getSimpleName() + ", (" + fieldRequest + ")");            }
}

Here is an example usage:

// demonstration of how the getFieldName() protects against mistakes...
String userNameField = User.getFieldName("name");       // this works
String userEmailField = User.getFieldName("userEmail"); // this throws an error

Upvotes: 0

AnthonyK
AnthonyK

Reputation: 473

In my understanding that isnt possible, the java compiler doesn't save variable names. What is it that your trying to do with such name?

Upvotes: -2

Danail Alexiev
Danail Alexiev

Reputation: 7772

You can do it like this:

Class<YourClass> clazz = // somehow get a reference to the class that contains the field
Field[] fields = clazz.getDeclaredFields();
List<String> fieldNames = new LinkedList<>();
for (Field field : fields) {
    if (field.isAnnotationPresent(@getnameofthisfield.class)) {
        fieldNames.add(field.getName);
    }
}

In the end fieldNames will contain the names of all fields, annotated with @getnameofthisfield.

Upvotes: 4

redAllocator
redAllocator

Reputation: 735

Get annotation value

import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;

    public class Util{
      @SuppressWarnings("unchecked")
      public static<T> T getAnnotationValue(Class<?> clazz,Class<? extends Annotation> annotationClass,String element) throws Exception {
        Annotation annotation = clazz.getAnnotation(annotationClass);
        Method method = annotationClass.getMethod(element,(Class[])null);
        if (annotation == null)
          return((T)method.getDefaultValue());
        return((T)method.invoke(annotation,(Object[])null));
      }
    }

Upvotes: -1

Related Questions