2010-02-04 31 views
24

Tôi đang thực hiện một số công việc phản chiếu và đi đến một vấn đề nhỏ.Lặp lại các mảng bằng cách phản chiếu

Tôi đang cố gắng in các đối tượng vào một số cây GUI và gặp sự cố khi phát hiện mảng theo cách chung chung.

tôi đề nghị rằng:

đối tượng instanceof Iterable

sẽ làm cho công việc, nhưng không, (rõ ràng là chỉ áp dụng cho danh sách và Set và bất cứ ai thực hiện nó.)

Vì vậy, làm thế nào mà tôi sẽ công nhận một Array Một số Object[], Hoặc long[] hoặc Long[] ..?

Cảm ơn

Trả lời

58

Nếu bạn không muốn chỉ để kiểm tra xem đối tượng là một mảng, mà còn để lặp nó:

if (array.getClass().isArray()) { 
    int length = Array.getLength(array); 
    for (int i = 0; i < length; i ++) { 
     Object arrayElement = Array.get(array, i); 
     System.out.println(arrayElement); 
    } 
} 

(lớp trên là java.lang.reflect.Array)

2

Bạn có thể làm

if (o instanceof Object[]) { 
    Object[] array = (Object[]) o; 
    // now access array.length or 
    // array.getClass().getComponentType() 
} 
+0

Điều này là tốt, nhưng nó sẽ không áp dụng cho các loại mảng nguyên thủy. Tôi nghĩ rằng tôi tìm thấy câu trả lời: object.getClass(). IsArray() .. lol – Roman

5

Bạn có nghĩa là Object.getClass().isArray()?

0

Trước hết, @ Bozho của câu trả lời là hoàn toàn chính xác.

Nếu bạn muốn chắc điều này là sử dụng được dễ dàng hơn, tôi vừa tạo một phương pháp trong little OSS utility molindo-utils của chúng tôi có thể biến một mảng không rõ loại thành một Iterable: ArrayUtils.toIterable(Object)

Bằng cách này, bạn có thể làm:

// any array, e.g. int[], Object[], String[], ... 
Object array = ...; 
for (Object element : ArrayUtils.toIterable(array)) { 
    // element of type Integer for int[] 
    System.out.println(element); 
} 

Xem README của molindo-utils về cách nhận mã thông báo hoặc cảm thấy tự do để sao chép mã nếu bạn thích, giống như bạn thấy phù hợp.

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