1

これは私の状況です:

パラメータとして文字列を持つメソッドがあります。このメソッドは、Urls というクラスからオブジェクトを受け取る必要があります。受信する必要があるオブジェクトは、文字列の値と同じ名前です。これが私のコードです:

private Object getObject(String objectName){
    try
    {
        Field field = Urls.class.getField(objectName);          
    }
    catch (NoSuchFieldException e)
    {}
    catch (IllegalAccessException e)
    {}
}

そして、ここに私の Urls クラスがあります:

public class Urls{

public static final String[] ASTUN = new String[]{
    "http://www.astun.com/camara/truchas.jpg",
    "https://www.todonieve.com/photowebcam.asp?fotografia=astun/astun.jpg",
    "http://www.astun.com/camara/caba%C3%B1a%20sarrios.jpg",
    "http://www.astun.com/camara/sector%20sarrios.jpg",
    "http://www.astun.com/camara/sector%20raca%20prad.jpg",
    "http://www.astun.com/camara/sector%20aguila%20cr.jpg",
    "http://www.astun.com/camara/sector%20truchas.jpg",
    "http://www.astun.com/camara/sector%20llanos%20.jpg",
    "http://www.astun.com/camara/llegada.jpg",
    "http://www.astun.com/camara/terraza.jpg",
    "http://www.astun.com/camara/panoramica.jpg",
    "http://www.astun.com/camara/snow.jpg"
};

private static final String[] CANDANCHU = new String[]{
    "https://www.todonieve.com/photowebcam.asp?fotografia=candanchu/candanchu.jpg",
    "https://www.todonieve.com/photowebcam.asp?fotografia=CandanchuNew/CandanchuNew.jpg",
    "https://www.todonieve.com/photowebcam.asp?fotografia=candanchu_rinconada/candanchu_rinco.jpg",
"https://www.todonieve.com/photowebcam.asp?fotografia=candanchu_tobazo/candanchu_tobazo.jpg"
};

}

このようにして Field オブジェクトを取得できますが、そのフィールドの String[] を取得するにはどうすればよいでしょうか? Field クラスの get(Object object) メソッドについて読みましたが、やりたいことをしていないようです...

編集: ASTUN または CANDACHU 文字列配列を取得したい

4

4 に答える 4

3

反射は可能な限り避けてください。それは多くの場合、良いことよりも害を及ぼします。

それらをマップに入れます:

public class Urls {
  //put your arrays here

  private static final Map<String,String[]> urlsLists = new HashMap<>();
  static {
    urlLists.put("ASTUN", ASTUN);
    urlLists.put("CANDANCHU", CANDANCHU);
  }

  public static String[] getUrlList(String name) {
    return urlLists.get(name);
  }
}

そして、次のように呼び出します。

private Object getObject(String objectName){
  return Urls.getUrlList(objectName);
}

アップデート

型安全性、カプセル化、コンパイル時のチェックなど、Java がサポートする多くの優れた機能が失われます。このため、エラーが発生しやすくなります。実行時エラーのリスクが非常に高くなり、これを処理するには追加のコードが必要になります。簡単な例には、すでに 2 つの catch 句があります。私を信じてください-それはただ悪化するでしょう.

Enum を作成して URL タイプを定義することで、タイプ セーフをさらに改善することもできます。次に、名前のスペルが正しいことをコンパイル時にチェックし、コード全体でオートコンプリートさえも行います。:)

public class Urls {
  public enum UrlTypes {ASTUN; CANDANCHU;}
  // ..
  private static final Map<UrlTypes,String[]> urlsLists = new HashMap<>();
  static {
    urlLists.put(UrlTypes.ASTUN, ASTUN);
    urlLists.put(UrlTypes.CANDANCHU, CANDANCHU);
  }
  ..
  public static String[] getUrlList(UrlTypes name) {
    return urlLists.get(name);
  }
}

実行時ではなくコンパイル時にキャッチできるすべてのエラーは、物事が複雑になると、30 分から 30 週間の作業を節約できます。

于 2013-10-23T21:25:40.543 に答える
1

次のようなものが必要になります。

private Object getObject(String objectName){
    try
    {
        Field field = Urls.class.getField(objectName);
        Object o = field.get(null); // null works as well.
        return o;
    }
    catch (NoSuchFieldException e)
    { e.printStackTrace(); }
    catch (IllegalAccessException e)
    { e.printStackTrace(); }
}

private String[] getStringArray(String arrayName)
{
    return (String[]) getObject(arrayName);
}

使用法:

Object o = getObject("ASTUN");
// or:
String[] arr = getStringArray("ASTUN");
于 2013-10-23T21:14:56.470 に答える
1

getFieldUrlsクラスのフィールド概念の (再帰的) 表現を返します。次に、そのクラスの実際のオブジェクトにバインドして、そのオブジェクトのフィールドの内容にアクセスできるようにする必要があります。

Field field = Urls.class.getFiled(objectName);
String[] values = (String[]) field.get(o);

ここoで、 は type の変数ですUrls

実際の型がわからないため、 asString[]へのキャストField.get()は を返すことに注意してください。Objectメソッドを使用して型が実際に正しいことを確認し、Field.getType()それを と比較する必要がありUrls.classます。

于 2013-10-23T21:20:08.510 に答える
0

オブジェクトには名前がないため、独自のクラスを作成し、そこにフィールド変数を配置してから、オブジェクトの代わりにそれを使用する必要があります。または、Map を使用してより適切なキー/値のログを記録します。

于 2013-10-23T21:15:33.367 に答える