如果对象 class 是使用 java 反射的字段数组,则无法获取包和 class 名称

cannot get package and class name if object class is array on field using java reflection

我有一些问题。

class example{
     Text text=new Text();
     int a;
     JLabel[] label=new JLabel[3];
     Panel[][][] panel=new Panel[5][5][5];
}

所以,我试过反思:

Class cls=Class.forName("example");
Field[]f=cls.getDeclaredFields();
for(field : f){
     field.getType().getPackage();
     field.getType().getName();
}

包的结果为空,class 的结果类似于 [[[Ljava.awt.Panel

数组是一种特殊类型。它不属于任何包。

尝试(未测试):

Class cls=Class.forName("example");
Field[]f=cls.getDeclaredFields();
for(Field field : f){
     Class<?> type = field.getType()
     int numArrayDimensions= 0;
     while (type.isArray()){
        type = type.getComponentType();
        numArrayDimensions++;
     }
     if (! type.isPrimitive()){
         Package pkg = type.getPackage();
     }
     String className = getFormattedClassName(type, numArrayDimensions);

}

private String getFormattedClassName(Class<?> type, int numArrayDimensions){
         StringBuilder sb = new StringBuilder(type.getName());
         IntStream.range(0, numArrayDimensions).foreach(dimension -> sb.append("[]"));
         return sb.toString();
}

另一方面,原语是一种语言特征。代表它们的 class 个对象不属于任何包。

尝试使用以下代码获取包名

        Package p=cls.getPackage();
        System.out.println(p.getName());

我试过示例程序

        Class cls=Countcharacters.class;            
        Package p=cls.getPackage();
        System.out.println(p.getName());

并以 Sflow 的形式输出,这是我的包名

根据您的评论,我假设您想要实现的是按照在 class 中声明的类似方式打印字段类型。所以如果 class 喜欢

class Example {
    int a;
    int[][] f;
    JLabel[][] label = new JLabel[3][];
    String s;
}

你想得到

int
int[][]
javax.swing.JLabel[][]
java.lang.String

然后在 Field 表示已声明字段的实例上使用 field.getType().<b>getTypeName()</b>

  • field.getType()将returnClass表示字段可以存储什么类型,
  • getTypeName() return 的名称易于阅读,因此对于字段 int[][] f;,您将得到 int[][] 而不是 [[I

演示:

class Example {
    int a;
    int[][] f;
    JLabel[][] label = new JLabel[3][];
    String s;
}

class Demo {

    public static void main(String[] ar) {
        Class<?> cls = Example.class;
        Field[] fields = cls.getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f.getType().getTypeName());
        }

    }
}