0

私はJavaMVCパターンを学習しようとしていますが、次の方法を理解できません。

protected void setModelProperty(String propertyName, Object newValue) {

        for (AbstractModel model: registeredModels) {
            try {

                Method method = model.getClass().
                    getMethod("set"+propertyName, new Class[] {
                                                      newValue.getClass()
                                                  }
                             );
                method.invoke(model, newValue);

            } catch (Exception ex) {
                //  Handle exception
            }
        }
    }

私は理解していません:

Method method = model.getClass().
                    getMethod("set"+propertyName, new Class[] {
                                                      newValue.getClass()
                                                  }
                             );

したがって、getMethodでは、プロパティに従って(setSomething)メソッド名を取得します。次の「thing」は、まったく理解できないこの派手な式で表現されるnewValueとしてのプロパティ値です。

new Class[] <---つまり、クラスの配列ですか?next { newValue.getClass() } <---- OK、メソッドを呼び出してクラス名を角かっこで囲みますが、セミコロンはどうですか?私にはわからない特別な構造があるに違いありません。クラスのように見えますが、セミコロンがない場合は別の構造に違いありません...人々はこれが何であるかを説明してくれます...

4

4 に答える 4

2

とともに:

new Class[] { newValue.getClass() }

クラスの配列をインラインで指定し、それをgetMethodの引数に渡します。

ミックスに「クラス」が含まれているため、おそらく少し混乱しますが、次のようなものと同じくらい有効です。

Integer[] bla = new Integer[]{1,2,3,4};

getMethodは、クラスで探しているメソッドの名前と、そのメソッドのパラメーターを指定するクラスの配列を引数として受け取ります。例:

getMethod("setValues", new Class[]{String.class, Integer.class}

次のようなメソッドを探します:

public Something setValues(String p1, Integer p2)

同じクラスに存在する場合でも、次のように一致しません。

public Something setValues(String p1)

またはその他のバリエーション。

于 2012-04-05T10:15:24.587 に答える
2

配列構文に関する質問に答えるために、これはJavaで配列を定義する方法です。

int[] intArray = new int[] {1, 2, 3};
String[] stringArray = new String[] {"a", "b", "c"};
Class classArray = new Class[] {Integer.class, String.class, Double.class};

したがって、式new Class[] {newValue.getClass()}Classインスタンスの配列であり、1つの要素を含みます。結果はnewValue.getClass()、したがって、のクラスですnewValue

このコードをどこから入手したかはわかりませんが、良いコードとは言えないことに注意してください。

  • リフレクションを使用しますが、これはほとんどの場合、悪い考えです。
  • JavaBeanの規則を尊重せず、java.beansAPIを使用してsetterメソッドにアクセスしません。
  • 継承はサポートされていません。つまり、Object型のオブジェクトでのみ呼び出すことができますsetFoo(Object o)(String、Integerなどでは呼び出せません)。
于 2012-04-05T10:19:36.170 に答える
1

仮定すると、次のようなメソッドを呼び出します

setModelProperty("Key", "value");

次に、ループ内のコードは、登録されているすべてのモデルで、シグネチャを持つメソッドを検索します

<any modifiers> <any returntype> setKey(String value);

次の行でそのメソッドを呼び出します。

プロパティ値を使用してセッターメソッド名を作成し、valuesクラスを使用してClassインスタンスを取得します。複数のgetMethod引数を持つメソッドを見つけられるようにしたいという理由だけで、メソッドはクラスの配列を取ります。

于 2012-04-05T10:07:31.537 に答える
1

これは少し抽象的なコーディング方法です。正直なところ、特に初心者レベルで、他の方法で(たとえば、テンプレートを使用して)実行できる場合は、この方法での作業はお勧めしません。とにかく、説明しようと思います。

Javaのすべてのクラスは、クラスClassのオブジェクトでもあります。そして、すべてのメソッドはクラスMethodのオブジェクトです。これらのオブジェクトは、他のオブジェクトと同じように、それらのメソッドを呼び出して他のメソッドの引数として使用するなどして操作できます。そうすれば、クラスの名前を文字列として知っているだけで、クラスを完全にインスタンス化できます。メソッドについても同じです。メソッドの名前を文字列として知っているだけで、メソッドを呼び出すことができます。

それでは、コードを見てみましょう。この部分の簡単な説明については、JavaAPIのこのエントリをざっと見てくださいgetMethod("set"+propertyName, new Class[] {newValue.getClass()});

メソッドを呼び出したいとしますsetParameter(int parameterValue) {...}。その場合、特定の整数に設定および設定しpropertyName"Parameter"メソッドを呼び出します。これで、結果はになります。これは、メソッドの名前です。を与える、それが何であるか。newValue123"set"+propertyNamesetParameternewValue.getClass()Integer123

ただし、はクラスの配列を必要とします。これgetMethodは、同じ名前のメソッドが多数存在する可能性があるが、引数の数とタイプが異なるためです(たとえば、メソッドsetParameter(double parameterValue) {...}も存在する可能性があります)。したがってnewValue.getClass()、を記述して、アイテムを1つだけ含む配列に配置しnew Class[] {newValue.getClass()}ます。

そして、あなたはそれを持っています:あなたはMethod呼び出すことによってオブジェクトを取得します

Method method = model.getClass(). getMethod("set"+propertyName, new Class[] {newValue.getClass()});

次に、を使用してそのメソッドを呼び出します。method.invoke(model, newValue);これは、単に動的に呼び出す方法ですsetParameter(123)

于 2012-04-05T10:25:32.653 に答える