2015-04-12 112 views
0

使用Java6反射API,Class.getDeclaredFields會返回相當奇怪的值。類字段的示例:'[L'前綴在Java反射中

protected String[] arrF = new String[15]; 

上適當Class使用getDeclaredFields,一個Field返回:

  • 名稱= arrF
  • 類型= [Ljava.lang.String;

的問題:不[L前綴意味着arrF是一個數組?我可以總是依靠那個,即該字段是一個數組iff類型前綴爲[L?如果不是,我怎麼能得到關於該領域的「陣列性」的一些信息?

回答

4

[指一維陣列([[是2名維陣列),並L後跟類/接口名稱(Lclassname)是陣列的類型。

我總是可以依賴於,即場的陣列IFF型帶有前綴[L?

是的。或者更好,使用Class#isArray()

+0

啊,我看到的組件類型。但是,爲了獲得數組的維數,我需要解析字符串來獲得'['的數量,對吧? 'Class'沒有辦法爲我做這件事。 – petrbel

+0

@petrbel看到這個問題:http://stackoverflow.com/questions/1764339/multi-dimension-length-array-reflection-java –

2

這是一個更好的方法來做到這一點!

import java.lang.reflect.Field; 
    import java.lang.reflect.Type; 
    import static java.lang.System.out; 

    public class ArrayFind { 
     public static void main(String... args) { 
      try { 
       Class<?> cls = Class.forName(args[0]); 
       Field[] flds = cls.getDeclaredFields(); 
       for (Field f : flds) { 
        Class<?> c = f.getType(); 
        if (c.isArray()) { 
         // .... 
        } 
       } 

      } catch (ClassNotFoundException x) { 
       x.printStackTrace(); 
      } 
     } 
    } 

Btw。字節[]有名字[B - [L有多長和/或引用。

0

你得到的是所謂的二進制名稱。二進制名稱能夠表示數組類型,因爲Java中的數組不會實現或擴展類似數組的接口。

[Ljava.lang.String;手段:

  1. [一維陣列
  2. L引用類型的陣列,而不是原語
  3. java.lang.String;表示數組