[英]Java Reflection Dealing with Arrays
我正在使用反射和遞歸來查找類中的字段。 問題是,我擁有的對象(PointCloud)中有2個字段:一個int時間戳和一個類型為4的數組(LidarLayerTag)。
當我嘗試在array元素上獲取field.getName()時,它返回一個列表類型[Lcom.joy.fb20.dds.LidarLayerTag,而不是我期望的非列表版本。
下面是我用來遞歸遍歷對象類型的代碼。 我修剪了其他類型,只剩下處理數組的部分,因為這就是問題所在。 關於如何正確處理獲取數組的單個元素而不是列表類型的任何想法?
我想要的東西比僅在通過遞歸發送的字符串的開頭替換“ [L]”更優雅,但是如果最壞的情況發生了,我可以這樣做。
public ArrayList<String> processIDLData(String topicName, String parentFieldName, Integer count)
{
Field[] fieldList = null;
String query = "";
ArrayList<String> layout = new ArrayList<String>();
try
{
fieldList = Class.forName(topicName).getDeclaredFields();
for (Field a : fieldList)
{
if (a.getType().isArray() && ((a.getType().getName().startsWith("["))))
{
// Dealing with primitive arrays
if (a.getType().getName().equals("[F"))
{
errorLog.error("Array of Floats = " + a.getName());
// Arrays of floats
for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName).getConstructor().newInstance())); i++)
{
layout.add(a.getName() + "[" + i + "]");
}
} else if (a.getType().getName().equals("[Ljava.lang.String;"))
{
errorLog.error("Array of Strings = " + a.getName());
// Arrays of Strings
for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName).getConstructor().newInstance())); i++)
{
layout.add(a.getName() + "[" + i + "]");
}
} else if (a.getType() == int[].class || a.getType() == double[].class || a.getType() == short[].class || a.getType() == char[].class || a.getType() == byte[].class
|| (com.rti.dds.util.Enum.class.isAssignableFrom(Class.forName(a.getType().getName().replace(";", "").replace("[L", "")))))
{
errorLog.error("Array of Primitives = " + a.getName());
// Arrays of ints, shorts, bytes, longs, chars, or enums
for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName).getConstructor().newInstance())); i++)
{
layout.add(a.getName() + "[" + i + "]");
}
} else
{
errorLog.error("Array of Objects = " + a.getName() + " " + a.getType().getName());
if (count == null || count == 0)
{
// Arrays of objects
for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName).getConstructor().newInstance())); i++)
{
layout.addAll(processIDLData(a.getType().getName(), a.getName(), i));
}
} else
{
for (int i = 0; i < Array.getLength(a.get(Class.forName(topicName).getConstructor().newInstance())); i++)
{
layout.addAll(processIDLData(a.getType().getName(), a.getName() + "[" + count + "]", i));
}
}
}
}
return layout;
}
為此,存在Class.getComponentType()
:
Field a; ...
if (a.getType().isArray()) {
Class<?> elementType = a.getComponentType();
if (elementType == float.class) { ... // float[]
... elementType.getSimpleName() ...;
}
}
遞歸組件類型,並對結果做一些事情,添加"[]"
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.