-2

public void test(Object obj){

       //Here i have to set the values of the obj using its setter . 
    }

テストは、パラメーターとして2つのオブジェクトを使用して呼び出すことができます。例:test(スタンドアロン)とtest(webapp)。スタンドアロンとwebappはBeanです。

public class standalone{
      int version;
   //setter and getter
}

public class Webapp{
     String version;
   //setter and getter
}

このテストメソッドは、パラメータオブジェクトに応じて値を設定する必要があります。例:スタンドアロンをパラメータとして渡す場合。スタンドアロンのsetterメソッドを呼び出す必要があります。これを達成する方法は?

注:インターフェースを使用せずに。これを行う方法?ありがとう。

4

6 に答える 6

1
public static void setVersion(Object obj, int v) throws Exception {
  for (Method m : obj.getClass().getMethods()) {
    final Class<?>[] t = m.getParameterTypes();
    if (m.getName().equals("setVersion") && t.length == 1)
      m.invoke(obj, t[0] == String.class? String.valueOf(v) : v);
      break;
  }
}
于 2012-06-29T11:47:14.107 に答える
0

あなたは単にこれを行うことができます:

interface SetVersion{
    void setVersion(int version);
}
class Standalone implements SetVersion{}
class WebApp implements SetVersion{}
public void test(SetVersion version){
      version.setVersion(1);
    }

または、最も簡単な方法は.instanceOf

if(obj.instanceOf(Standalone)){

}
于 2012-06-29T12:08:26.847 に答える
0

最も簡単な方法で、次のように行うことができます。

public void test(Object obj) {

    if( obj instanceof Standalone ) {
        ((Standalone)obj).setVersion(1);
    } else if (obj instanceof WebApp ) {
        ((WebApp)obj).setVersion(1);
    }

}

これを達成するためにリファクタリングの使用を避けるようにしてください。リファクタリングタスクが非常に困難になるためです。クラス名を文字列と比較する場合も同様です。

よりエレガントなものが必要な場合は、次のようにすることができます。

public class abstract AbstractEnv {
    int version = 0;
    // setters and getters
}

public class Standalone extends AbstractEnv{
}

public class Webapp extends AbstractEnv{
}

このアプローチでは、次のように構成できます。

public void test(AbstractEnv obj) {

    obj.setVersion(1);

}
于 2012-06-29T11:46:49.167 に答える
0

どちらのクラスも、のようなインターフェースを実装する必要がありますVersionSettable。メソッドを宣言しsetVersion(int version)ます。

public class standalone implements VersionSettable {
      int version;
   //setter and getter
}

public class Webapp implements VersionSettable {
      int version;
   //setter and getter
}

interface VersionSettable {
    setVersion(int version);
}

次に、テスト方法を次のように変更できます。

public void test(VersionSettable obj){
   obj.setVersion(17);
}
于 2012-06-29T11:47:53.413 に答える
0

StandAloneとWebAppの両方にインターフェースを実装させることができます。

interface VersionSettable {
    void setVersion(int version);
}

public class Standalone implements VersionSettable{
      int version;
   //setter and getter
}

public class Webapp implements VersionSettable{
      int version;
   //setter and getter
}

public void test(VersionSettable versionSettable){
   versionSettable.setVersion(42);
}
于 2012-06-29T11:51:16.293 に答える
0

この場合、継承を使用するのが最善だと思います。なぜなら、(私が入手できる限りでは)スタンドアロンとWebAppの両方がアプリケーションだからです。

したがって、 「is a」関係を定義できるため、トップクラスの「アプリケーション」を定義し、StandaloneAppとWebAppの両方でそれを拡張できます。

スケルトンコード:

define class Application
define class StandaloneApp extends Application, implements method setVersion(int)
define class WebApp extends Application, implements method setVersion(int)

define test method, which accepts "Application" obj in the arguments

また、上記の任意のインターフェースソリューションを適用できます。

于 2012-06-29T11:58:47.980 に答える