Генератор метамодели для любого старого класса?
Я считаю, что функциональность генератора метамоделей 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
Я надеюсь, что это помогает!