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

Java-根据类的名称获取类的对象,java,class,object,field,Java,Class,Object,Field,这就是我的情况: 我有一个以字符串作为参数的方法。此方法必须从名为URL的类接收对象。它必须接收的对象的名称与字符串的值相同。这是我的密码: private Object getObject(String objectName){ try { Field field = Urls.class.getField(objectName); } catch (NoSuchFieldException e) {} cat

这就是我的情况:

我有一个以字符串作为参数的方法。此方法必须从名为URL的类接收对象。它必须接收的对象的名称与字符串的值相同。这是我的密码:

private Object getObject(String objectName){
    try
    {
        Field field = Urls.class.getField(objectName);          
    }
    catch (NoSuchFieldException e)
    {}
    catch (IllegalAccessException e)
    {}
}
下面是我的URL类:

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对象,但是我怎么才能得到这个字段的字符串[]?我已经读过Field类的get(Object)方法,但似乎我没有做我想做的事情


编辑:我想获得ASTUN或CANDACHU字符串数组

您将需要以下内容:

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);
}
private Object getObject(String objectName){
  return Urls.getUrlList(objectName);
}
用法:

Object o = getObject("ASTUN");
// or:
String[] arr = getStringArray("ASTUN");

您将需要以下内容:

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);
}
private Object getObject(String objectName){
  return Urls.getUrlList(objectName);
}
用法:

Object o = getObject("ASTUN");
// or:
String[] arr = getStringArray("ASTUN");

由于对象没有名称,您需要创建ypur自己的类,将字段变量放在其中,然后使用该变量而不是对象。或者使用映射更好地记录键/值。

由于对象没有名称,您需要创建ypur自己的类,将字段变量放在其中,然后使用该变量而不是对象。或者使用映射更好地记录键/值。

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

Field field = Urls.class.getFiled(objectName);
String[] values = (String[]) field.get(o);
其中
o
是类型为
url
的变量


请注意,强制转换为
字符串[]
作为
字段。get()
将返回一个
对象,因为它不知道实际的类型。您应该使用
Field.getType()
方法确保类型确实正确,并将其与
URL进行比较。class
getField
将返回
URL
类中字段概念的(自反)表示。然后需要将其与该类的实际对象绑定,才能访问该对象中字段的内容

Field field = Urls.class.getFiled(objectName);
String[] values = (String[]) field.get(o);
其中
o
是类型为
url
的变量


请注意,强制转换为
字符串[]
作为
字段。get()
将返回一个
对象,因为它不知道实际的类型。您应该使用
Field.getType()
方法确保类型确实正确,并将其与
URL进行比较。class

尽可能避免反射。它往往弊大于利

把它们放到地图上:

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

您失去了许多Java帮助您的好东西,包括类型安全、封装和编译时检查。因此,它更容易出错。运行时错误的风险大大增加,您需要一堆额外的代码来处理这一问题。您的简短示例已经有两个catch子句。相信我,那只会变得更糟

您甚至可以通过创建枚举来定义url类型来提高类型安全性。然后,您将得到编译时检查,以确保名称拼写正确,甚至在整个代码中自动完成。:)

公共类URL{
公共枚举URL类型{ASTUN;CANDANCHU;}
// ..
私有静态最终映射urlsLists=newHashMap();
静止的{
urlLists.put(UrlTypes.ASTUN,ASTUN);
put(UrlTypes.CANDANCHU,CANDANCHU);
}
..
公共静态字符串[]getUrlList(UrlTypes名称){
返回urlLists.get(名称);
}
}

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

尽可能避免反射。它往往弊大于利

把它们放到地图上:

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

您失去了许多Java帮助您的好东西,包括类型安全、封装和编译时检查。因此,它更容易出错。运行时错误的风险大大增加,您需要一堆额外的代码来处理这一问题。您的简短示例已经有两个catch子句。相信我,那只会变得更糟

您甚至可以通过创建枚举来定义url类型来提高类型安全性。然后,您将得到编译时检查,以确保名称拼写正确,甚至在整个代码中自动完成。:)

公共类URL{
公共枚举URL类型{ASTUN;CANDANCHU;}
// ..
私有静态最终映射urlsLists=newHashMap();
静止的{
urlLists.put(UrlTypes.ASTUN,ASTUN);
put(UrlTypes.CANDANCHU,CANDANCHU);
}
..
公共静态字符串[]getUrlList(UrlTypes名称){
返回urlLists.get(名称);
}
}

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

对象没有“名称”。你是说变量吗?如果是这样,那么代码就会有一种代码味道。你想创建一张地图吗?请注意,URL类只包含字符串的静态数组。用一根绳子得到一根绳子的目的是什么?你能举个例子说明你期望得到的结果吗?+装满鳗鱼的气垫船好吧,我是说其中一个领域。。。作为参数传递的字符串将包含“ASTUN”或“CANDANCHU”,您可以更好地描述此代码试图解决的问题,而不是您试图使用的代码解决方案。我觉得这一切都不对,我想知道是否有更好的方法来解决整个问题,也许你找错了方向。对象没有“名称”。你是说变量吗?如果是这样,那么代码就会有一种代码味道。你想创建一张地图吗?请注意,URL类只包含字符串的静态数组。用一根绳子得到一根绳子的目的是什么?你能举个例子说明你期望得到的结果吗?+装满鳗鱼的气垫船好吧,我是说其中一个领域。。。作为参数传递的字符串将包含“ASTUN”或“CANDANCHU”,您可以更好地描述此代码试图解决的问题,而不是您试图使用的代码解决方案。这气味真难闻