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

(Java/Spring)使用entityType.getJavaType()访问类元素,java,spring-boot,instanceof,entities,Java,Spring Boot,Instanceof,Entities,我创建了一个通用的Spring Entity类“TableWithId”,该类将由其他类继承 这里是从基类剪下的一个: @Entity @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "__base_table") public class TableWithId { public static String EntityLabel = "All data"; @Id @GeneratedVal

我创建了一个通用的Spring Entity类“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类访问“publicstaticstringEntityLabel”。事实上,我想这样做:

((TableWithId)  entityType.getJavaType()).EntityLabel
(2) 出于安全原因,我还喜欢保护系统,不允许用户对其他不从TableWithId继承的实体进行查询。我想做一些类似的事情:

entityType.getJavaType() instanceof TableWithId

非常感谢您的帮助:)

getJavaType为您提供了一个类实例。您可以通过反射访问静态字段:
entityType.getJavaType().getField(“EntityLabel”).get(null)

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


Class.forName(“xxxx.TableWithId”).isAssignableFrom(entityType.getJavaType())
Thx到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();
        }
    }
}
公共类EntityInfo{
公共类myclass;
公共字符串标签;
公共哈希表操作;
公共字符串名称;
公共EntityInfo(字符串名称){
this.name=名称;
试一试{
this.myclass=Class.forName(name);
this.label=(字符串)this.myclass.getField(“EntityLabel”).get(null);
this.actions=(哈希表)this.myclass.getMethod(“getActions”).invoke(null);
}捕获(例外e){
e、 printStackTrace();
}
}
}

非常感谢我的解答,尽管如此,我现在不知道如何处理instanceof,因为此时我没有对象。。。我将在下面发布我的实现。关于isAssignableFrom works without object…的建议解决方案,前提是您知道类名。