这是我的情况:
我有一个方法,它有一个字符串作为参数。此方法必须从名为 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 字符串数组
最佳答案
尽可能避免反射。它往往弊大于利。
将它们放入 map 中:
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 子句。相信我 - 这只会变得更糟。
您甚至可以通过创建枚举来定义 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);
}
}
当事情变得复杂时,您可以在编译时而不是在运行时捕获的每个错误都可以为您节省半小时或半周的工作时间。
关于Java-根据名称获取类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19552381/