(Java / Spring) Доступ к элементам класса с помощью entityType.getJavaType () - PullRequest
0 голосов
/ 14 марта 2020

Я создал обобщенный c Spring Entiy-Class "TableWithId", который предназначен для наследования другими классами.

Здесь отрывок из базового класса:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "__base_table")
public class TableWithId {
    public static String EntityLabel = "All data";

    @Id
    @GeneratedValue
    protected Long id;

Так что в моих подклассах я реализую дополнительные поля et c. Это работает очень хорошо, создает, заполняет и отображает содержимое в соответствии с ожиданиями ...

Теперь я хочу получить список всех моих сущностей. Это прекрасно работает, по крайней мере, для получения имен и имен классов.

entityManager.getMetamodel().getEntities()

На основе имени объекта я также могу загружать объекты на основе пользовательских параметров:

entityManager.createQuery("Select t from " + entityName + " t").getResultList();

Теперь есть две вещи, которые я не могу сделать:

(1) Доступ к свойствам моих классов c java, на самом деле я хочу получить доступ к "publi c stati c String EntityLabel" во время выполнения используя java -класс, возвращаемый функцией entityType.getJavaType (). На самом деле я хотел бы сделать что-то вроде этого:

((TableWithId)  entityType.getJavaType()).EntityLabel

(2) Из соображений безопасности мне также нравится защищать систему, не позволяя пользователю делать запросы к другим объектам, которые не наследуются от TableWithId , Я хотел бы сделать что-то вроде:

entityType.getJavaType() instanceof TableWithId

Любая помощь приветствуется:)

Ответы [ 2 ]

1 голос
/ 14 марта 2020

getJavaType дает вам экземпляр класса. Вы можете получить доступ к полю stati c через отражение: entityType.getJavaType().getField("EntityLabel").get(null)

, если хотите проверить, совпадает ли класс с другим классом или суперинтерфейсом, который вы должны использовать isAssignableFrom:

Class.forName("xxxx.TableWithId").isAssignableFrom(entityType.getJavaType())

0 голосов
/ 15 марта 2020

Thx to pero_hero Я понял это, кроме пути к классам ...

Вот мое полное решение ...

public class EntityInfo {
    public Class myclass;
    public String label;
    public Hashtable<String, Action> actions;
    public String name;

    public EntityInfo(String name) {
        this.name = name;

        try {
            this.myclass =  Class.forName(name);
            this.label = (String) this.myclass.getField("EntityLabel").get(null);
            this.actions = (Hashtable<String, Action>) this.myclass.getMethod("getActions").invoke(null);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...