Получение значений аннотации из @XMLElement в классе java - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь получить аннотации @XMLElement из имеющегося у меня класса java, в основном пытаюсь составить карту переменных, где требуется аннотация: true. Однако это ничего не печатает.

У меня есть класс java, который имеет следующий фрагмент:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
  "subjectCode",
   "version",
   "messageTitle",
})
@XmlRootElement(name = "CreateMessageRequest", namespace = "mynamespaceblahblah")
public class CreateMessageRequest
  extends AbstractRequest
  implements Serializable
{

private final static long serialVersionUID = 10007L;
@XmlElement(namespace = "mynamespaceblahblah", required = true)
protected String subjectCode;
@XmlElement(namespace = "mynamespaceblahblah")
protected String version;
@XmlElement(namespace = "mynamespaceblahblah", required = true)
protected String messageTitle;


//Getters and setters
}

Я пробовал это:

 public HashMap<String, String> getRequired(Class<?> c) {

HashMap<String, String> fieldMap = new HashMap<>();

Annotation[] annotations = c.getAnnotations();
for (int i = 0; i < annotations.length; i++) {

  Annotation annotation = annotations[i];
  if (annotation instanceof XmlElement) {
    XmlElement theElement = (XmlElement) annotation;
    String name = ((XmlElement) annotation).name();

    if (theElement.required()) {
      fieldMap.put(name, "true");
    } else {
      fieldMap.put(name, "false");
    }
  }
}
return fieldMap;
}

Но когда я использую свой метод с:

SchemaBuilder s = new SchemaBuilder();
System.out.println("Required Methods of class:");

HashMap<String, String> fieldMap = s.getRequired(CreateMessageRequest.class);

for (Map.Entry<String, String> entry : fieldMap.entrySet()) {
  System.out.println(entry.getKey() + " = " + entry.getValue());
}

Распечатывается

Required Methods of class:

Любой совет, что я делаю не так? Я считал, что поскольку он защищен, я не могу получить к нему доступ (к сожалению, я не могу изменить аннотированный класс), но я не уверен, что это проблема.

1 Ответ

1 голос
/ 03 февраля 2020

Решением было посмотреть на отдельные поля в соответствии с предложениями:)

Чтобы помочь будущим гуглерам:

public HashMap<String, String> getRequired(Class<?> c) {

HashMap<String, String> fieldMap = new HashMap<>();

Field[] fields = c.getDeclaredFields();
for (Field f : fields) {

  Annotation[] annotations = f.getAnnotationsByType(XmlElement.class);
  for (int i = 0; i < annotations.length; i++) {
    Annotation annotation = annotations[i];

    if (annotation instanceof XmlElement) {
      XmlElement theElement = (XmlElement) annotation;
      String name = f.getName();
      if (theElement.required()) {
        fieldMap.put(name, "true");
      } else {
        fieldMap.put(name, "false");
      }
    }
  }
}
return fieldMap;
}
...