Получить аннотированное спящее имя таблицы из POJO

Большинство размещенных решений отличные и работают нормально, но у них есть ограничение на то, что ваш класс должен быть сериализуемым (подробнее см .: https://docs.microsoft.com/en-us/dotnet/standard / serialization / basic-serialization ) Однако, если вы не сериализуете класс, может оказаться полезным следующий код. Этот код учитывает тот факт, что использование ссылочного поля не является бесплатным, оно добавляет некоторые накладные расходы. Он также рассматривает использование среднего размера для строк, чтобы вы получили лучшее приближение.

    /// 
    /// Gets the size of object.
    /// 
    /// The object.
    /// Average size of the string.
    /// An approximation of the size of the object in bytes
    public static int GetSizeOfObject(object obj, int avgStringSize=-1)
    {
        int pointerSize = IntPtr.Size;
        int size = 0;
        Type type = obj.GetType();
        var info = type.GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
        foreach (var field in info)
        {
            if (field.FieldType.IsValueType)
            {
                size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType);
            }
            else
            {
                size += pointerSize;
                if (field.FieldType.IsArray)
                {
                    var array = field.GetValue(obj) as Array;
                    if (array != null)
                    {
                        var elementType = array.GetType().GetElementType();
                        if (elementType.IsValueType)
                        {
                            size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType) * array.Length;
                        }
                        else
                        {
                            size += pointerSize * array.Length;
                            if (elementType == typeof(string) && avgStringSize > 0)
                            {
                                size += avgStringSize * array.Length;
                            }
                        }
                    }
                }
                else if (field.FieldType == typeof(string) && avgStringSize > 0)
                {
                    size += avgStringSize;
                }
            }
        }
        return size;
    }

13
задан rjdkolb 2 November 2017 в 13:34
поделиться

2 ответа

Достаточно просто с использованием общего отражения:

import javax.persistence.Table;

.....

Class<?> c = User.class;
Table table = c.getAnnotation(Table.class);
String tableName = table.name();
27
ответ дан 1 December 2019 в 19:31
поделиться

Аналогично Получите имя таблицы из модели в Hibernate

Table table = Entity.class.getAnnotation(Table.class);
String tableName = table.name();
8
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: