プロキシを作成するクラスからアクセス可能なコンストラクタが必要です。ここで
はあなたが必要なものを実装する方法です:
final Hello hello = new Hello() {
public void hi() {
System.out.println("Hello World");
}
};
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Hello.class);
MethodHandler handler = (self, m, proceed, args) -> {
// This allows to proxy even non accessible methods, it could not be
// needed depending on your context
if (!m.isAccessible())
m.setAccessible(true);
return m.invoke(hello, args);
};
Hello proxy = (Hello)factory.create(new Class<?>[0], new Object[0], handler);
proxy.hi();
は出力:この例では
Hello World
:
- まず、私は私の工場
を作成します
- その後、私はその後、私は
- 最後に、私はここで私はデフォルトを使用(私のプロキシを作成(ここで私は私のライブオブジェクトにすべてを委任する)メソッドは、プロキシに呼び出すすべてを処理する方法を定義し
- スーパークラスを提供プロキシを作成するコンストラクタ)。ここ
Hello proxy = (Hello)factory.create(
new Class<?>[]{String.class}, new Object[]{"bar"}, handler
);
私は1つの引数を持つコンストラクタを呼び出す:あなたは次のように最後の行を変更する必要があります1つのString
引数を持つコンストラクタを持っていると仮定すると
詳細here
タイプString
であり、値としてbar
を提供しました。
ニースのニコラス!しかし、これは既定のコンストラクタの単純なケース、つまり、私のクラスがゼロ引数のコンストラクタだけを取る場合にのみ機能します。別のコンストラクタを使ってオブジェクトを作成した場合は、問題が発生します。 –
いいえあなたは工場の作成メソッドの引数を変更するだけです –
@PikaSucar具体的な例を与えるために私の答えを更新しました –