Отражение Java в работе с массивами - PullRequest
0 голосов
/ 24 апреля 2018

Я использую рефлексию и рекурсию, чтобы найти поля в классе. Проблема в том, что у моего объекта (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;
    }

1 Ответ

0 голосов
/ 24 апреля 2018

Для этого есть Class.getComponentType():

Field a; ...
if (a.getType().isArray()) {
    Class<?> elementType = a.getComponentType();
    if (elementType == float.class) { ... // float[]
        ... elementType.getSimpleName() ...;
    }
}

Исправьте тип компонента и сделайте что-нибудь с результатом, добавив "[]" или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...