Java - 根据名称获取类的对象

时间:2013-10-23 21:12:18

标签: java class object field

这是我的情况:

我有一个String作为参数的方法。此方法必须从名为Urls的类接收对象。它必须接收的对象与String的值具有相同的名称。这是我的代码:

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对象)方法,但似乎我没有做我想做的事情......

编辑:我想获得ASTUN或CANDACHU STRING ARRAYS

4 个答案:

答案 0 :(得分: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帮助你的好东西,包括类型安全,封装和编译时检查。因此,它更容易出错。运行时错误的风险大大增加,您需要一堆额外的代码来处理这个问题。您的简短示例已经有两个catch子句。相信我 - 这会变得更糟。

您甚至可以通过创建Enum来定义url-types来进一步提高类型安全性。然后,您将获得编译时间检查,您已拼写正确的名称,甚至自动完成整个代码。 :)

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);
  }
}

您可以在编译时而不是在运行时捕获的每个错误可以在半小时或半周的工作中节省您的时间,当事情变得复杂时。

答案 1 :(得分: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");

答案 2 :(得分:1)

getField将返回Urls类中字段概念的(自反)表示。然后,您需要将其与该类的实际对象绑定,以访问该对象中字段的内容。

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

其中oUrls类型的变量。

请注意,String[]转换为Field.get()将返回Object,因为它不知道实际类型。您应该使用Field.getType()方法确保类型确实正确,然后将其与Urls.class进行比较。

答案 3 :(得分:0)

由于对象没有名称,您需要创建自己的类,将字段变量放在那里,然后使用它而不是Object。或者使用Map来获得更好的键/值记录。