[英]Java - Get object of class depending on its name
这是我的情况:
我有一个方法,其中有一个字符串作为参数。 此方法必须从称为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 object)方法,但似乎我没有做我想做的事...
编辑:我想得到ASTUN或CANDACHU STRING数组
尽可能避免反射。 它弊大于利。
将它们放入地图:
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);
}
}
当事情变得复杂时,您在编译时(而不是运行时)遇到的每个错误都可以为您节省半小时或半个星期的工作。
您将需要以下内容:
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");
getField
将返回Urls
类中字段概念的(自反)表示形式。 然后,您需要将其与该类的实际对象绑定,以访问该对象中字段的内容。
Field field = Urls.class.getFiled(objectName);
String[] values = (String[]) field.get(o);
其中o
是Urls
类型的变量。
注意要转换成String[]
为Field.get()
将返回一个Object
,因为它不知道实际的类型。 您应该使用Urls.class
Field.getType()
方法确保类型确实正确,并将其与Urls.class
进行比较。
由于对象没有名称,因此您需要创建ypur自己的类,将field变量放在其中,然后使用该变量代替Object。 或使用地图更好地记录键/值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.