为什么在运行时使用jre Websphere而不是正常的jre 1.7正常工作会出现此问题?

时间:2019-03-14 23:49:18

标签: java websphere

我正在使用JPA,并且有一张重复n计划的表。该查询是用jpql编写的,我需要根据避免创建重复代码的需要指定其他方案。更确切地说,我想更改注释@Table (name = "nameofTable", schema = "nameofSchema")的nameOfSchema的值 在运行时,然后执行查询。在这方面,我编写了以下方法。当使用普通的JRE 1.7运行时,它可以正常工作,但是当我使用Websphere JRE 1.7运行该方法时,出现运行时错误。

`public void changeTableSchema(final String schema,Class<?> entityWithTable) throws Exception {
    try {
        final String ANNOTATIONS = "annotations";
        Table anntotationToChange = entityWithTable.getAnnotation(Table.class);
        final Table anntotationToChangeCopy = anntotationToChange;
        anntotationToChange = new Table() {
            @Override
            public Class<? extends Annotation> annotationType() {
                return anntotationToChangeCopy.annotationType();
            }

            @Override
            public UniqueConstraint[] uniqueConstraints() {
                return anntotationToChangeCopy.uniqueConstraints();
            }

            @Override
            public String schema() {
                return schema;
            }

            @Override
            public String name() {
                return anntotationToChangeCopy.name();
            }

            @Override
            public String catalog() {
                return anntotationToChangeCopy.catalog();
            }
        };
        Field annotations = Class.class.getDeclaredField(ANNOTATIONS);
        annotations.setAccessible(true);
        Map<Class<? extends Annotation>, Annotation> map = (Map<Class<? extends Annotation>, Annotation>) annotations
                .get(entityWithTable.class);
        map.put(Table.class, anntotationToChange);
    } catch (Exception e) {
        e.printStackTrace();
    }
} `
  

错误是:
  java.lang.NoSuchFieldException:批注     在java.lang.Class.getDeclaredFieldImpl(本地方法)     在java.lang.Class.getDeclaredField(Class.java:720)     在它上。solarisistemi.awondo.be.web.Prova.changeTableSchema(Prova.java:106)     在it.solarisistemi.awondo.be.web.Prova.main(Prova.java:23)

1 个答案:

答案 0 :(得分:2)

发生此错误的原因是因为您正在侵入java.lang.Class的实现中的一个不可见字段,并且Java类的实现可能会根据不同的JDK发行版而有所不同(例如Oracle与IBM JDK与。OpenJDK)。

更重要的是,这些内部字段可能在同一供应商的JDK版本(例如IBM JDK 7到IBM JDK 8)之间更改或消失,因为它们从未公开发布。

我建议使用以下解决方案之一,而不是侵入注释值:

  1. 在数据库端设置表别名
  2. 使用@Table.name()的新值重新编译必要的应用程序类