2012-06-19 65 views
8

Tôi có một đối tượng Field field.Cách kiểm tra xem đối tượng có phải là một mảng của một loại nhất định

Tôi muốn kiểm tra xem field là đối tượng thuộc loại Foo hoặc một mảng: Foo[].

mã giả:

if field.getType() is Foo || field.getType is Foo[] 

Đây có phải là có thể?

Tôi đã thử

if (field.getType().isArray()) 
    // do something 

Nhưng điều này sẽ chỉ cho phép tôi để kiểm tra xem field là một mảng.

Việc làm này, ngược lại, sẽ chỉ kiểm tra xem nó là một đối tượng của Foo

if (Foo.class.isAssignableFrom(field.getType()) 
    // do something 

Bất kỳ ý tưởng làm thế nào để làm điều này?

Cảm ơn.

+0

"Tôi có một trường Dòng đối tượng" ?? Đối tượng của bạn thuộc loại Field. Bạn có kiểm tra xem Foo hoặc Foo của nó [] –

+0

Tôi đã chỉnh sửa câu trả lời của mình chưa (bây giờ là một câu trả lời mới :-)) – Ixx

Trả lời

16

Dưới đây là một số mã tôi đã sử dụng một lần để xử lý các mảng của tất cả các loại nguyên thủy trong Java. Vì chúng không mở rộng lớp Object, việc kiểm tra instanceof cho Object [] là không đủ.

/* Check if the given object is an array. */ 
if (object.getClass().isArray()) { 

    Class<?> componentType; 
    componentType = object.getClass().getComponentType(); 

    if (componentType.isPrimitive()) { 

     if (boolean.class.isAssignableFrom(componentType)) { 
      for (boolean anElement : (boolean[]) object) { 
       /* ... */ 
      } 
     } 

     else if (byte.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (char.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (double.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (float.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (int.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (long.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (short.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     /* No else. No other primitive types exist. */ 
    } 

    else { 
     /* Do something with Object[] here. */ 
    } 
} 
+0

Thanhks. đây là những gì tôi cần –

0
if (field instanceof Object[]) 

Điều đó nên thực hiện.

0

Kể từ loại mảng được reified, bạn chỉ có thể sử dụng

if (field.getType() == Foo.class || field.getType() == Foo[].class) { 
} 

Full dụ:

public class Scratchpad { 
    String[] strings; 

    public static void main(String[] args) throws NoSuchFieldException { 
     if (Scratchpad.class.getDeclaredField("strings").getType() == String[].class) { 
      System.out.println("They're Strings!"); 
     } 

     if (Scratchpad.class.getDeclaredField("strings").getType() == Long[].class) { 
      System.out.println("They're Longs!"); 
     } 
    } 
} 
+0

Tôi không tin 'Foo []. Class' thậm chí sẽ biên dịch. –

+0

Rõ ràng, tôi vừa thử 'Foo []. Class', và đó không phải là cú pháp hợp lệ –

+0

Làm việc tốt cho tôi trên java 6. –

2

Giả lĩnh vực bạn đề cập đến là một java.lang.reflect.Field, bạn chỉ có thể làm

field.getType().equals(Foo.class) || field.getType().equals(Foo[].class) 
2

So sánh đơn giản nên hoạt động

import java.lang.reflect.Field; 

public class Main { 

String[] myStringArray; 
String[] myStringArray2; 

Object[] myObjectArray; 

String str; 


public static void main(String... args) { 
     Field[] flds = Main.class.getDeclaredFields(); 
     for (Field f : flds) { 
      Class<?> c = f.getType(); 

      if (c == String[].class) { 
       System.out.println("field" + f.getName() + " is String[]"); 
      } 
      if (c == String.class) { 
       System.out.println("field" + f.getName() + " is String"); 
      } 
      if (c == Object[].class) { 
       System.out.println("field" + f.getName() + " is Object[]"); 
      } 
     } 
} 

}

0

tôi sẽ làm một cái gì đó như thế này:

public static void main(String[] args) { 
    Foo foo = new Foo(); 
    Foo[] other = new Foo[1]; 
    other[0] = new Foo(); 

    System.out.println(isFooOrArrayOfFoo(foo)); 
    System.out.println(isFooOrArrayOfFoo(other[0])); 
    System.out.println(isFooOrArrayOfFoo(new Object())); 
} 

private static boolean isFooOrArrayOfFoo(Object o) { 
    return (o instanceof Foo || o.getClass().equals(Foo.class) && o.getClass().isArray()); 
} 
Các vấn đề liên quan