任何旧 class 的元模型生成器?
Metamodel generator for any old class?
我发现 JPA 元模型生成器功能对于避免列名更改时的错误非常有用。如果有一些更通用的元模型生成工具,您可以指向任何 class(或许多包)来生成类似的元模型 classes,那就太好了。当事情发生变化时,这可以用来创建编译错误而不是运行时错误:
public class SomeClass {
public int somePublicProperty;
public String someStringMethod() {
..
}
}
这可能会创建一个元模型 class,例如:
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 中有一点支持,现在我们可以进行方法引用,但如果存在的话,我想要更像元模型的东西。
我有过几次这样的需求,并且已经实现了:
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
注释你的class
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());
在 Eclipse 中开发时生成 *_INFO.java
- 右键单击项目 > 属性
- Java编译器>注解处理>工厂路径
- 添加两个jar:bean-info-generator-0.0.1.jar和javapoet-1.9.0.jar
希望对您有所帮助!
我发现 JPA 元模型生成器功能对于避免列名更改时的错误非常有用。如果有一些更通用的元模型生成工具,您可以指向任何 class(或许多包)来生成类似的元模型 classes,那就太好了。当事情发生变化时,这可以用来创建编译错误而不是运行时错误:
public class SomeClass {
public int somePublicProperty;
public String someStringMethod() {
..
}
}
这可能会创建一个元模型 class,例如:
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 中有一点支持,现在我们可以进行方法引用,但如果存在的话,我想要更像元模型的东西。
我有过几次这样的需求,并且已经实现了: 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
注释你的classimport 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());
在 Eclipse 中开发时生成 *_INFO.java
- 右键单击项目 > 属性
- Java编译器>注解处理>工厂路径
- 添加两个jar:bean-info-generator-0.0.1.jar和javapoet-1.9.0.jar
希望对您有所帮助!