如何实例化ArrayList <! - ? - >并通过Java反射添加项目?

时间:2009-07-07 16:42:15

标签: java reflection arraylist

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

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

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

以下是该方法的精简版本:

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

       return obj;
    }
}

调用此方法如下所示:

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

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

谢谢!

4 个答案:

答案 0 :(得分:8)

应该是非常接近的东西:

Object list = field.getType().newInstance();

Method add = List.class.getDeclaredMethod("add",Object.class);

add.invoke(list, addToAddToList);

希望这有帮助。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您必须创建原始类型 List(即没有类型参数)。

List subs = deserialize( ... );

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

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

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