0

我经常发现自己想将一个活的 java 对象复制到我的测试中(在源代码中)。我怀疑这通常是可行的,但也许asJavaSourceCode()可以为所有@AutoValue对象生成一个方法?

这是一些代码来演示我想要的。

import com.google.auto.value.AutoValue;


@AutoValue
public abstract class Person {

    public abstract String name();

    public abstract Integer age();

    public static Person create(String name, Integer age) {
        return new AutoValue_Person(name, age);
    }

    public String asJavaSourceCode() {
        // Can this code be automatically generated?
        return "Person.create(\"" + name() + "\"," + age() + ")";
    }

    public static void main(String[] args) {
        System.out.println(Person.create("Jordan", 29));
        System.out.println(Person.create("Jordan", 29).asJavaSourceCode());
    }
}

运行这个我得到。

Person{name=Jordan, age=29}
Person.create("Jordan",29)

我会认为其中任何一个都是对这个问题的有效答案:

  • “是的,这是一个图书馆链接
  • “不,它还不存在”
  • “其他人也做过类似的事情。”
  • “这是不好的做法,不要这样做,请参阅 Effective Java Book Item XYZ”
4

1 回答 1

1

asJavaSourceCode()我认为您可以使用 Java反射编写一个通用的。Start with this.getClass()which 返回一个java.lang.Class对象。getName()使用方法或获取类getCanonicalName()getSimpleName()。使用获取类的Field描述getFields()。每个都为您提供了一个字段名称及其类型,以及获取其当前值的方法。

由于您正在使用@AutoValue您可以在您的类上假设一个create()方法(您也可以通过反射发现),但我不确定您能否可靠地发现此方法的参数顺序,因为反射Method将为您提供参数类型以正确的顺序,但不是他们的名字。如果@AutoValue没有确定地对它们进行排序,那么您可以在发现具有反射的字段时以某种方式重现,然后使用@AutoValue 构建器而不是create()将允许您编写按名称设置字段的源代码。

于 2016-05-20T17:28:01.547 回答