Большинство размещенных решений отличные и работают нормально, но у них есть ограничение на то, что ваш класс должен быть сериализуемым (подробнее см .: 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;
}
Достаточно просто с использованием общего отражения:
import javax.persistence.Table;
.....
Class<?> c = User.class;
Table table = c.getAnnotation(Table.class);
String tableName = table.name();
Аналогично Получите имя таблицы из модели в Hibernate
Table table = Entity.class.getAnnotation(Table.class);
String tableName = table.name();