任何旧 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

希望对您有所帮助!