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

Я считаю, что функциональность генератора метамоделей 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 имеют полезные методы, подобные атрибутам, для помощи с вызовами отражения (т.е. устраняют необходимость иметь открытые строки):

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

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

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

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> Обработка аннотаций> Путь к фабрике
  • Добавьте два jar-файла: bean-info-generator-0.0.1.jar и javapoet-1.9.0.jar

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

Другие вопросы по тегам