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

时间:2015-04-30 14:37:56

标签: 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();
}

package的结果为null,类的结果如[[[Ljava.awt.Panel

3 个答案:

答案 0 :(得分:2)

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

尝试(未经测试):

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();
}
另一方面,

基元是一种语言特征。表示它们的类对象不属于任何包。

答案 1 :(得分:1)

根据您的评论,我假设您要实现的目的是以类似于在类中声明的方式打印字段类型。所以,如果对于类

public partial class MyForm : Form
{
    private MyModel Model;

    public MyForm(MyModel model)
    {
        InitializeComponent();

        Model = model;

        // Create our bindings

        dtpDate.DataBindings.Add(new Binding("Value", Model,
            this.GetPropertyName((MyModel x) => x.ProxyWhenDate)));

        dtpTime.DataBindings.Add(new Binding("Value", Model,
            this.GetPropertyName((MyModel x) => x.ProxyWhenTime)));
    }
}

你想得到

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

然后在int int[][] javax.swing.JLabel[][] java.lang.String 实例上表示声明的字段使用Field

  • field.getType().getTypeName()将返回表示可以在字段中存储的类型的类,
  • field.getType()以易于理解的形式返回姓名,因此对于字段getTypeName(),您将获得int[][] f;而不是int[][]

演示:

[[I

答案 2 :(得分:-1)

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

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

我尝试过示例程序

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

并以Sflow的形式获得了我的包名