すべてのエージェントは、買い物に行くとき、多くのエージェントがいて、元の製品を販売していることを知っています。たとえば、毎日肉を購入したい場合、豚は農家によって育てられますが、肉屋から肉を買うと、肉屋はエージェントと見なされます。それでは、なぜエージェントが必要ですか?豚を虐殺します。もちろん、肉屋は肉を何らかの水で満たすことです。
このプロセスをコードで実装する方法:肉屋と農家の3つのカテゴリを使用して、それぞれ肉屋、農家、農家を紹介する必要があります。その中で、農家は肉を購入するための肉を購入する方法も提供し、肉の量を返します。
コードコピーは次のとおりです。
クラスファーマー{
public int buymeat(int money){
int meat = 0;
// ...肉= ***;
肉を返します。
}
}
肉屋は、肉を購入する方法を提供し、肉を返しますが、肉を処理します(コードで豚を殺し、豚の毛を剃る必要があります。コードは次のとおりです。
コードコピーは次のとおりです。
クラスの肉屋{
public int buymeat(int money){
農家農家= new Farmer();
int meat = farmer.buymeat(money);
肉 += 5;
肉を返します。
}
}
ただし、肉屋から肉を購入するコードは次のようになります。
コードコピーは次のとおりです。
クラスあなた{
public void work(){
int youmoney = 10;
Butcher Butcher = New Butcher();
int meat = butcher.buymeat(youmoney);
System.out.println( "肉を調理し、体重:" +肉); //調理しました。
}
}
また、このプログラムには、肉を購入する場合、肉を購入することができる農家がいることがわかりました。肉屋または農家です。
コードコピーは次のとおりです。
クラスあなた{
public void work(){
int youmoney = 10;
Peldar Peldar = new Butcher();
int meat = peldar.buymeat(youmoney);
System.out.println( "肉を調理し、体重:" +肉);
}
}
インターフェイスペルダー{
int buymeat(int money);
}
クラスの肉屋はペルダールを実装しています{
@オーバーライド
public int buymeat(int money){
農家農家= new Farmer();
int meat = farmer.buymeat(money);
肉 += 5;
肉を返します。
}
}
クラスファーマーはペルダールを実装しています{
@オーバーライド
public int buymeat(int money){
int meat = 0;
// ...肉= ***;
肉を返します。
}
}
これは、一般的なプロキシクラスと最終的なクラスが同じインターフェースを実装することに注目する価値があります。
ただし、これは静的プロキシと呼ばれます。これは、プロキシクラス(Butcherクラス)がお客様によって書かれており、動的プロキシはJavaが実行されているときに同等のプロキシクラスを動的に生成することです。クラスは動的に生成されますが、豚を殺し、水を注入するためのコードを書く必要がありますが、クラスを書くだけではありません。次のインターフェースに書く場所
コードコピーは次のとおりです。
public interface rivocationhandler {
パブリックオブジェクトInvoke(Object Proxy、Method Method、Object [] args)スロー可能。
}
パラメーターはこの方法を書いたのですか?
コードコピーは次のとおりです。
public interface rivocationhandler {
パブリックオブジェクトが呼び出されます(オブジェクトブッチャー、メソッドbuymeat、object [] money)スロー可能。
}
最初のパラメーターは、自動生成されたプロキシクラス(自動的に生成される肉屋クラスのオブジェクト)のオブジェクトであり、2番目のパラメーターは呼び出されているメソッドのオブジェクトです(メソッドにはオブジェクトがあり、Javaを参照してください。反射メカニズムは、buymeatと呼ばれる1つの方法しかありません。したがって、豚を殺して水を充填するためのコードは、それが書かれたときにこのようになります:
コードコピーは次のとおりです。
InvocationHandler minvocationHandler = new InvocationHandler(){
@オーバーライド
パブリックオブジェクトの呼び出し(オブジェクトブッチャー、メソッドbuymeat、object args)スローが投げられる{
農家農家= new Farmer();
int meat =(integer)buymeat.invoke(farmer、args);
肉 += 5;
肉を返します。
}
};
これは、農家の肉購入方法を呼び出す従来の方法と少し矛盾しています。あなたはそれを直接呼び出してみませんか?ファーマーオブジェクトではなく、多くのファーマーオブジェクトがあり、特定のインターフェイスのインスタンスとして使用できます(インターフェイスは以下に指定されている、最初に名前を付けてみましょう)。次に、次のように、プロキシクラスを生成する方法をご覧ください。
コードコピーは次のとおりです。
public staticオブジェクトNewProxyInstance(classloaderローダー、クラス<?
IllegalargumentExceptionをスローします
パラメーターを説明します。これは、プロキシクラスをロードするために使用されますインターフェースであり、エージェントはこれらすべてのインターフェイスを実装します。配列では、前の段落に記載されている呼び出しが障害の問題も明らかです。 3番目のパラメーターであるInvocationHandlerは、よりよく理解されています。つまり、プロキシクラスのどの方法も呼び出されている限り、InvocationHandlerに通知されます。完全なコードを以下に記述します。
コードコピーは次のとおりです。
クラスあなた{
public void work(){
int youmoney = 10;
Peldar Peldarproxy =(Peldar)proxy.newproxyinstance(getClass()。getClassLoader()、new class [] {peldar.class}、minvocationhandler);
int meat = peldarproxy.buymeat(youmoney);
System.out.println( "肉を調理し、体重:" +肉);
}
InvocationHandler minvocationHandler = new InvocationHandler(){
@オーバーライド
パブリックオブジェクトが呼び出される(オブジェクト肉屋、メソッドbuymeat、object [] args)
スローできるスロー{
農家農家= new Farmer();
int meat =(integer)buymeat.invoke(farmer、args);
肉 += 5;
肉を返します。
}
};
}
インターフェイスペルダー{
int buymeat(int money);
}
クラスファーマーはペルダールを実装しています{
@オーバーライド
public int buymeat(int money){
int meat = 0;
// ...肉= ***;
肉を返します。
}
}
ここでは、プロキシクラスでプロキシクラスが生成されます。コードは以前の静的プロキシと同じです。