0

I often find myself wanting to copy a living java object into my tests (in the source code). I doubt this is generally doable, but perhaps a asJavaSourceCode() method could be generated for all @AutoValue objects?

Here is some code to demonstrate what I want.

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());
    }
}

When running this I get.

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

I would consider any of these a valid answer to this question:

  • "Yes, here's a library link"
  • "No, it doesn't exist yet"
  • "Somebody else did something similar."
  • "That is bad practice, don't do it, see Effective Java Book Item XYZ"
4

1 に答える 1

1

asJavaSourceCode()Javaリフレクションを使って汎用的に書けると思います。java.lang.Classオブジェクトthis.getClass()を返します。メソッド、またはでクラス名を取得します。でクラスの説明を取得します。それぞれに、フィールド名とそのタイプ、および現在の値を取得するメソッドが示されます。getName()getCanonicalName()getSimpleName()FieldgetFields()

使用しているため、クラス@AutoValueのメソッドを想定できcreate()ます(リフレクションでも検出できます)が、リフレクションMethodがパラメーターの型を提供するため、このメソッドのパラメーターの順序を確実に検出できるかどうかはわかりません正しい順序ですが、名前ではありません。@AutoValueリフレクションを使用してフィールドを発見したときに再現できるように、それらを決定論的に順序付けしない場合は、代わりに@AutoValue ビルダーcreate()を使用すると、フィールドを名前で設定するソースを作成できます。

于 2016-05-20T17:28:01.547 に答える