Java通过反射确定未知数组中的数组大小
这一点很难解释,但我会试一试。我试图动态创建一个模仿java对象的数据库表。因此,对于特定对象中定义的每个字段,它将具有每个列。这些java对象中可以定义原语、数组和其他对象。我正在从我创建的递归函数生成SQLite create语句。更具体地说,此函数将在DB create table查询中创建列/类型对 我遇到的问题是试图确定数组大小。下面是生成列/类型对的函数Java通过反射确定未知数组中的数组大小,java,reflection,Java,Reflection,这一点很难解释,但我会试一试。我试图动态创建一个模仿java对象的数据库表。因此,对于特定对象中定义的每个字段,它将具有每个列。这些java对象中可以定义原语、数组和其他对象。我正在从我创建的递归函数生成SQLite create语句。更具体地说,此函数将在DB create table查询中创建列/类型对 我遇到的问题是试图确定数组大小。下面是生成列/类型对的函数 public String processColumnData(String topicName) { Field fie
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;
}
我想既然大小是在数组的实例化中定义的,我应该能够以某种方式获得该值。有什么办法吗?您可以使用getter iArray for类:
Integer[] array = { 1, 2, 3, 4, 5 };
Object obj = array;
int lenght;
if(obj.getClass().isArray()){
lenght = (Integer)obj.getClass().getField("lenght").get(obj);
}
所以我解决这个问题的方法是通过以下方式创建一个对象的人造实例:
Class.forName(topicName).getConstructor().newInstance()
我将其传递到a.get()以查找数组长度。长度不是数组类型的属性。只有数组实例有长度。我知道,但由于它是在类的顶部实例化的,所以。。。它不是类中的实例吗?-我谦虚的建议是:序列化(作为json?)并将其作为文本存储在您的数据库中。事实并非如此。该类的字节码包含实例化数组并在实例初始化期间将其分配给字段的代码。每个实例都有自己的实例,而类本身没有实例。原则上,您需要的数据因此被隐藏在类中,但您不能以反射方式访问它。这是数组的实例。我只有一个类对象,我知道其中一个字段是数组。
NoSuchFieldException:length
——甚至修复了类型:NoSuchFieldException:length
Class.forName(topicName).getConstructor().newInstance()