有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java通过反射确定未知数组中的数组大小

这一点很难解释,但我会试一试。我试图动态创建一个模仿java对象的数据库表。因此,对于特定对象中定义的每个字段,它将具有每个列。这些java对象中可以定义原语、数组和其他对象。我正在从我创建的递归函数生成SQLite create语句。更具体地说,此函数将在DB create table查询中创建列/类型对

我遇到的问题是试图确定数组大小。下面是生成列/类型对的函数

public String processColumnData(String topicName)
{
    Field fieldList[] = null;
    String query = "";

    try
    {
        fieldList = Class.forName(topicName).getDeclaredFields();

        for (Field a : fieldList)
        {
            if ((a.getType().getName().equals("int")) || (a.getType().getName().equals("long")) || (a.getType().getName().equals("short")) || (a.getType().getName().equals("byte"))
                    || (a.getType().getName().equals("boolean")) || (com.rti.dds.util.Enum.class.isAssignableFrom(a.getType())))
            {
                query = query + "'" + a.getName() + "'" + " INTEGER,";
            } else if (a.getType().getName().equals("java.lang.String"))
            {
                query = query + "'" + a.getName() + "'" + " TEXT,";
            } else if (a.getType().getName().equals("float"))
            {
                query = query + "'" + a.getName() + "'" + " REAL,";
            } else if (a.getType().isArray() && ((a.getType().getName().startsWith("["))))
            {
                if (a.getType().getName().equals("[F"))
                {
                    for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName))); i++)
                    {
                        query = query + "'" + a.getName() + "[" + i + "]' REAL,";
                    }
                } else if ((a.getType().getName().equals("[Ljava.lang.String;")))
                {
                    for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName))); i++)
                    {
                        query = query + "'" + a.getName() + "[" + i + "]' TEXT,";
                    }
                } else if (a.getType().getName().equals("[I") || a.getType().getName().equals("[S") || a.getType().getName().equals("[B")
                        || (com.rti.dds.util.Enum.class.isAssignableFrom(Class.forName(a.getType().getName().replace(";", "").replace("[L", "")))))
                {
                    for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName))); i++)
                    {
                        query = query + "'" + a.getName() + "[" + i + "]' INTEGER,";
                    }
                } else
                {
                    // TODO: Arrays of objects not enums.
                }
            } else
            {
                processColumnData(a.getType().getName());
            }

        }
    } catch (SecurityException e)
    {
        // TODO Auto-generated catch block
        System.out.println("Security Exception");
        return null;
    } catch (ClassNotFoundException e)
    {
        // TODO Auto-generated catch block
        System.out.println("Class not found " + topicName);
        return null;
    } catch (IllegalArgumentException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(query);
    return query;
}

原语直截了当,但当我谈到数组时,它不会让我确定大小。我知道我应该将类的实例传递给get(),而不是类本身,但我目前没有实例。下面是一个具有数组的对象的示例,该数组可用于上述函数:

public class jOverLoad   implements Copyable, Serializable{

public int machineId= 0;
public int motorIndex= 0;
public int motorDescriptionTidx= 0;
public jTimeType timeOfLastThermalTrip = (jTimeType)jTimeType.create();
public float thermalTimer= 0;
public boolean thermalWarning= false;
public boolean thermalTrip= false;
public boolean jamWarning= false;
public boolean jamTrip= false;
public int jamResetTimer= 0;
public float phaseImbalance= 0;
public boolean phaseImbalanceTrip= false;
public boolean phaseAOK= false;
public boolean phaseBOK= false;
public boolean phaseCOK= false;
public jRtdStatus [] rtdTripStatus=  new jRtdStatus [(J_MAX_MOTOR_RTDS.VALUE)];

我想既然大小是在数组的实例化中定义的,我应该能够以某种方式获得该值。有办法吗


共 (2) 个答案

  1. # 1 楼答案

    所以我解决这个问题的方法是通过以下方式创建一个对象的人造实例:

    Class.forName(topicName).getConstructor().newInstance()
    

    我将其传递到a.get()以查找数组长度

  2. # 2 楼答案

    您可以将getter isArray用于类:

        Integer[] array = { 1, 2, 3, 4, 5 };
        Object obj = array;
    
        int lenght;
    
        if(obj.getClass().isArray()){
            lenght = (Integer)obj.getClass().getField("lenght").get(obj);
        }