'Java反射中的[L'前缀

时间:2015-04-12 08:33:03

标签: java arrays reflection

使用Java6反射API,Class.getDeclaredFields返回非常奇怪的值。类字段示例:

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

在正确的getDeclaredFields上使用Class,会返回Field

  • name = arrF
  • type = [Ljava.lang.String;

问题:[L前缀是否意味着arrF是一个数组?我可以一直依赖它,即字段是iff类型以[L为前缀的数组吗?如果不是,我如何获得有关该字段“数组”的一些信息?

3 个答案:

答案 0 :(得分:5)

[表示一维数组([[是2维数组),L后跟类/接口名称(Lclassname)是该类型阵列。

  

我可以一直依赖它,即字段是iff类型以[L?

为前缀的数组

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

答案 1 :(得分: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();
            }
        }
    }

顺便说一下。 byte []具有名称[B - [L表示长篇和/或引用。

答案 2 :(得分:0)

你得到的是所谓的二进制名称。二进制名称能够表示数组类型,因为Java中的数组不实现或扩展类似数组的接口。

[Ljava.lang.String;表示:

  1. [单维数组
  2. L引用类型数组,而不是基元
  3. java.lang.String;表示数组的组件类型