';Java反射中的[L';前缀

';Java反射中的[L';前缀,java,arrays,reflection,Java,Arrays,Reflection,使用Java6反射API,Class.getDeclaredFields返回非常奇怪的值。类字段示例: protected String[] arrF = new String[15]; 在适当的类上使用getDeclaredFields,返回一个字段: 名称=arrF type=[Ljava.lang.String; 问题是:[L前缀是否意味着arrF是一个数组?我是否可以始终依赖于此,即字段是一个数组,如果iff类型的前缀是[L?如果不是,我如何获得有关字段“arraynes”的一些信

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

protected String[] arrF = new String[15];
在适当的
类上使用
getDeclaredFields
,返回一个
字段

  • 名称=
    arrF
  • type=
    [Ljava.lang.String;

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

[
表示一维数组(
[
是二维数组),然后是类/接口名称(
Lclassname
)是该数组的类型

我能否始终依赖于此,即字段是一个数组,iff类型前缀为[L”


是的。或者更好,使用。

这是一种更好的方法

    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();
            }
        }
    }
import java.lang.reflect.Field;
导入java.lang.reflect.Type;
导入静态java.lang.System.out;
公共类数组查找{
公共静态void main(字符串…参数){
试一试{
Class cls=Class.forName(args[0]);
字段[]flds=cls.getDeclaredFields();
用于(字段f:flds){
类c=f.getType();
if(c.isArray()){
// ....
}
}
}捕获(ClassNotFoundException x){
x、 printStackTrace();
}
}
}

顺便说一句,byte[]的名称为[B-[L]表示长字符和/或引用。

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

[Ljava.lang.String;
表示:

  • [
    一维数组
  • L
    引用类型而非原语的数组
  • java.lang.String;
    表示数组的组件类型

  • 哦,我明白了。但是,要得到数组的维数,我需要解析字符串以获得
    [
    ,对吗?
    类没有方法为我这样做。@petrbel看到这个问题了: