如何实例化ArrayList 并通过Javareflection添加项?

我正在编写一个将xml转换为Java对象的反序列化方法。 我想动态地执行此操作,并避免将硬编码引用写入特定类型。

例如,这是我的一个类的简化版本。

public class MyObject { public ArrayList SubObjects = new ArrayList(); } 

以下是该方法的精简版:

 public class Serializer { public static  T fromXml(String xml, Class c) { T obj = c.newInstance(); Field field = obj.getClass().getField("SubObjects"); //help : create instance of ArrayList and add an item //help#2 : field.set(obj, newArrayList); return obj; } } 

调用此方法将如下所示:

 MyObject obj = Serializer.fromXml("myxmldata", MyObject.class); 

请原谅我,如果这是一个微不足道的问题,因为我是一名学习Java的C#开发人员。

谢谢!

应该是非常接近的东西:

 Object list = field.getType().newInstance(); Method add = List.class.getDeclaredMethod("add",Object.class); add.invoke(list, addToAddToList); 

希望这可以帮助。

这里的真正问题似乎是从XML到java对象。 如果是这种情况(并且因为您不熟悉Java),那么比滚动自己更好的解决方案可能是调查现有技术,例如:

  • 蓖麻
  • XStream的
  • JAXB

在java中,generics只是语法糖,它们在运行时不存在。 这就是您无法在运行时以编程方式创建通用对象的原因。 尝试创建非通用列表和演员(但我不确定,因为我的经验受限于GWT)。

您将不得不创建一个原始类型的 List (即没有类型参数)。

 List subs = deserialize( ... ); 

如果您要直接在类上设置原始类型List

 obj.setSubObjects(subs); //You'll get an "unchecked cast" warning at compile time 

虽然编译器会发出警告,但它是合法的Java代码,并且在运行时运行得很好,因为参数类型信息丢失(即在运行时, ListList之间没有区别)。 你当然可以反思性地设置它。