gpt4 book ai didi

Java 反射处理数组

转载 作者:行者123 更新时间:2023-12-02 11:19:57 26 4
gpt4 key购买 nike

我正在使用反射和递归来查找类中的字段。问题是,我拥有的一个对象(PointCloud)中有 2 个字段:一个 int Timestamp 和一个 4 个类型的数组(LidarLayerTag)。

当我尝试获取数组元素上的 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() ...;
}
}

递归组件类型并对结果执行某些操作,添加 "[]" 等。

关于Java 反射处理数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com