6

我正在编写一个将 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

4 回答 4

10

应该非常接近:

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

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

add.invoke(list, addToAddToList);

希望这可以帮助。

于 2009-07-07T16:54:47.100 回答
3

看来这里真正的问题是从 XML 到 java 对象。如果是这种情况(并且由于您是 Java 新手),比自己动手更好的解决方案可能是调查现有技术,例如:

于 2009-07-07T17:01:08.460 回答
0

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

于 2009-07-07T16:49:20.437 回答
0

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

List subs = deserialize( ... );

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

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

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

于 2009-07-07T16:53:39.647 回答