0

引数として任意の Java Bean を指定すると、その Bean のコピーであるが、追加のプロパティを含む Bean の型の無名サブクラスに属するオブジェクトを返す関数を作成したいと考えています。私がこれまでに持っているものの例で説明しましょう:

Foo.java:

import lombok.Data;
import lombol.AllArgsConstructor;

@Data
@AllArgsConstructor
public class Foo {
    private String bar;
    private String baz;
}

Garply.java:

public class Garply {
    Foo fooWithQux(Foo foo, String quxVal) {
        return new Foo(foo.bar, foo.baz) {
            private String qux;

            public String getQux() {
                return quxVal;
            }
        };
    }
}

実際には を呼び出すことができないため、これはばかげているように思えますgetQux()が、私が使用しているツールは、リフレクションを使用してquxプロパティを正常に見つけ、それを使用して必要なことを行います。

私の問題は、プロパティをfooWithQux()追加できるようにしたいタイプごとに個別の関数を持ちたくないということです。理想的には、任意のタイプのオブジェクトを受け入れるquxようなものが必要です。beanWithQux()次のようなものでこれを機能させることができると思います:

public T beanWithQux<T>(T bean, String quxVal) {
    class BeanWithQux extends T {
        private String qux;

        BeanWithQux(T bean, String quxVal) {
            // Here's where I'd like to copy all of the properties
            // from the Bean into the BeanWithQux

            qux = quxVal;
        }

        public getQux() {
            return qux;
        }
    }

    return BeanWithQux(bean, quxVal);
}

ここが私が立ち往生している場所です。指定されたオブジェクトのすべてのプロパティを新しいオブジェクトにコピーする方法がわかりません。誰にもアイデアがありますか?理想的には、たくさんのリフレクション マジックを自分で書くのではなく、lombok (Fooクラスを制御し、必要に応じて注釈を追加できます) を使用してできることがあるでしょう。@Builder

ありがとう!

4

1 に答える 1

1

この場合、独自のコードベースでメソッドを呼び出す必要がないため、ランタイム バイトコード ウィービングを使用する方が良い方法だと思います。

于 2016-07-19T08:07:17.207 に答える