2009-07-07 33 views
6

Tôi đang viết một phương pháp deserialization chuyển đổi xml sang một đối tượng Java. Tôi muốn làm điều này một cách năng động và tránh viết các tham chiếu được mã hóa cứng đến các loại cụ thể.Làm thế nào để tạo một ArrayList <?> và thêm một mục thông qua sự phản chiếu với Java?

Ví dụ: đây là phiên bản đơn giản của một trong các lớp học của tôi.

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

Đây là một phiên bản rút gọn của phương pháp này:

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; 
    } 
} 

gọi method này sẽ trông như thế này:

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

tha thứ cho tôi nếu điều này là một vấn đề tầm thường như tôi một nhà phát triển Java của nhà phát triển C#.

Cảm ơn!

+0

Bạn có thể cung cấp ví dụ về tệp XML không? – CookieOfFortune

+0

Điều gì xảy ra nếu subObject được khai báo là một giao diện (chẳng hạn như Danh sách)? –

Trả lời

7

nên được một cái gì đó khá gần:

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

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

add.invoke(list, addToAddToList); 

Hope this helps.

+0

Cảm ơn, đây là những gì tôi đang tìm kiếm. Bạn cũng có thể giải thích làm thế nào tôi có thể nhận được các loại thông tin cho SubObject trong trường hợp danh sách? – user82334

+0

Đó là bit không có, thông tin kiểu chung cho các bộ sưu tập không có sẵn khi chạy trong Java. Generics được thực hiện trong trình biên dịch. –

+0

Tôi đoán bit bạn đang theo sau là làm thế nào để biết những gì lớp để nhanh chóng để thêm vào bạn đối tượng danh sách mới? Thông tin đó không có sẵn, bạn có thể tự thêm nó bằng cách tạo chú thích và chú thích trường SubObjects với nó, giống như @SerialisationType (SubObject.class) –

0

Trong Generics java chỉ là đường cú pháp và chúng không tồn tại trong thời gian chạy. Đây là lý do tại sao bạn không thể tạo lập trình các đối tượng chung trong thời gian chạy theo chương trình. Cố gắng tạo danh sách không phải chung chung và truyền (tuy nhiên tôi không chắc chắn là kinh nghiệm của tôi bị giới hạn với GWT).

+0

Điều đó không hoàn toàn đúng. Nếu bạn có một lớp MyArray mở rộng ArrayList , thì bạn có thông tin kiểu khi chạy. Ngoài ra, nó có thể khởi tạo một đối tượng trong thời gian chạy mà mã phôi đến một đối tượng "tham số" - diễn viên sẽ vô nghĩa và trình biên dịch của bạn sẽ tạo ra một cảnh báo kiểm tra kiểu –

+0

@Oxbow: Lớp sẽ lưu trữ kiểu tham số của nó chữ ký phương thức trong thời gian chạy. Tôi không tin một bộ sưu tập cá nhân. – Jherico

0

Bạn sẽ phải tạo được nhập thôList (tức là không có thông số loại).

List subs = deserialize(...); 

Nếu bạn đã thiết lập gõ thô List trên lớp của bạn trực tiếp:

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

Mặc dù trình biên dịch sẽ phát ra một cảnh báo, nó là mã Java pháp lý và sẽ chỉ chạy tốt khi chạy vì thông tin kiểu tham số bị mất (tức là khi chạy, không có sự khác biệt giữa ListList<SomeClass>). Tất nhiên bạn cũng có thể đặt nó một cách phản xạ.

3

Dường như vấn đề thực sự ở đây là chuyển từ XML sang đối tượng java. Nếu đúng như vậy (và kể từ khi bạn là người mới đến Java), một giải pháp tốt hơn so với cán của riêng bạn có thể để điều tra các công nghệ hiện có như:

Các vấn đề liên quan