我创建了一个通用的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
感谢您的任何帮助:)
getJavaType给您一个类实例。您可以通过反射访问静态字段:entityType.getJavaType().getField("EntityLabel").get(null)
如果要测试一个类是否与另一个超类或超接口相同,则应使用isAssignableFrom:
Class.forName("xxxx.TableWithId").isAssignableFrom(entityType.getJavaType())
感谢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();
}
}
}