((Java / Spring)使用entityType.getJavaType()访问类元素

问题描述 投票:0回答:2

我创建了一个通用的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;

因此,在我的子类中,我正在实现其他字段,等等。这很好,它可以按预期方式创建,填充和列出内容...

现在,我希望能够获得我所有实体的列表。这样做至少可以很好地获得名称和类名。

entityManager.getMetamodel().getEntities()

基于实体名称,我还可以根据用户参数加载实体:

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

现在有两件事我不能做:

((1)访问我的类的静态Java属性,我实际上想在运行时使用“ entityType.getJavaType()”返回的Java类访问“公共静态String EntityLabel”。实际上,我想做这样的事情:

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

((2)出于安​​全原因,我也喜欢通过不允许用户对不继承自TableWithId的其他实体进行查询来保护系统。我想做类似的事情:

entityType.getJavaType() instanceof TableWithId

感谢您的任何帮助:)

java spring-boot instanceof entities
2个回答
0
投票

getJavaType给您一个类实例。您可以通过反射访问静态字段:entityType.getJavaType().getField("EntityLabel").get(null)

如果要测试一个类是否与另一个超类或超接口相同,则应使用isAssignableFrom:

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


0
投票

感谢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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.