Генератор метамоделей для любого старого класса?

Я считаю, что функциональность генератора метамодели JPA действительно полезна для предотвращения ошибок при изменении имен столбцов. Было бы действительно здорово, если бы существовал какой-то более универсальный инструмент для создания метамоделей, который можно было бы указать на любой класс (или несколько пакетов), которые генерировали бы аналогичные классы метамоделей. Затем это можно использовать для создания ошибок компиляции, а не во время выполнения, когда что-то меняется:

public class SomeClass {
  public int somePublicProperty;

  public String someStringMethod() {
    ..
  }
}

Это может создать класс метамодели, например:

public class SomeClass_ {
  public static final FieldAttribute<SomeClass,Integer> somePublicProperty;

  public static final MethodAttribute<SomeClass,String> somePublicMethod;
}

где FieldAttribute и MethodAttribute имеют полезные методы, подобные Attribute, для помощи в вызовах отражения (т. е. устраняют необходимость иметь голые строки):

Object someClassInstance = ... 
Integer value = SomeClass_.somePublicProperty.get( someClassInstance );

// rather than 
Integer value = someClassInstance.getClass().getDeclaredField( "somePublicProperty" ).get( someClassInstance );

Есть ли что-то подобное в настоящее время? В Java 8 есть небольшая поддержка, теперь мы можем делать ссылки на методы, но я бы хотел что-то более похожее на метамодель, если оно существует.


person fancyplants    schedule 04.08.2017    source источник
comment
Eclipse Dali будет динамически генерировать соответствующие классы метамодели JPA, пока вы редактируете свои объекты.   -  person Brian Vosburgh    schedule 04.08.2017
comment
Привет, Брайан. Я посмотрел на Дали, и, кажется, это только для классов JPA. Мне нужен универсальный генератор метамоделей, который можно применять к любому классу, а не только к JPA @Entities.   -  person fancyplants    schedule 07.08.2017
comment
Ааа - я видимо невнимательно читал. Прости за это.   -  person Brian Vosburgh    schedule 07.08.2017


Ответы (1)


У меня была такая потребность несколько раз, и я реализовал это: https://github.com/mhagnumdw/bean-info-generator

Ниже, как вы это используете

Если вы используете Maven, добавьте его в pom.xml.

<dependency>
    <groupId>io.github.mhagnumdw</groupId>
    <artifactId>bean-info-generator</artifactId>
    <version>0.0.1</version>
    <scope>compile</scope>
</dependency>

Аннотируйте свой класс с помощью @GenerateBeanMetaInfo

import io.github.mhagnumdw.beaninfogenerator.GenerateBeanMetaInfo;
@GenerateBeanMetaInfo
public class SomeClass {
    private int someProperty;
}

При запуске сборки генерируются SomeClass_INFO.java и SomeClass_INFO.class.

public abstract class SomeClass_INFO {
    public static final BeanMetaInfo someProperty = new BeanMetaInfo("someProperty");
}

Теперь вы можете сделать что-то вроде этого

Field field = SomeClass.class.getDeclaredField(SomeClass_INFO.someProperty.getName());

Создайте *_INFO.java во время разработки в Eclipse

  • Щелкните правой кнопкой мыши проект> Свойства
  • Компилятор Java > Обработка аннотаций > Заводской путь
  • Добавьте две банки: bean-info-generator-0.0.1.jar и javapoet-1.9.0.jar.

Я надеюсь, что это помогает!

person MhagnumDw    schedule 04.01.2018
comment
Это выглядит довольно близко к тому, что я искал, спасибо! - person fancyplants; 01.02.2018