Я знаю решение, предоставляющее все, что вы хотите, но это огромный взлом, которого я бы не хотел в своем собственном коде в наше время:
Если Entity
может быть абстрактным, просто добавьте ваши методы, предоставивметаданные в этот базовый класс и объявить их abstract
.
В противном случае создайте интерфейс с методами, обеспечивающими все ваши данные, подобные этому
public interface EntityMetaData{
public String getTableName();
...
}
Все подклассы Entity должны были бы реализовать этохотя интерфейс.
Теперь ваша проблема - вызвать эти методы из вашего статического служебного метода, так как у вас там нет экземпляра.Так что вам нужно создать экземпляр.Использование Class.newInstance()
нецелесообразно, так как вам потребуется нулевой конструктор, и может потребоваться дорогая инициализация или инициализация с побочными эффектами, происходящими в конструкторе, запускать не нужно.
ВзломЯ предлагаю использовать Objenesis для создания экземпляра вашего класса.Эта библиотека позволяет создавать любой класс, не вызывая конструктор.Нет нужды в нулевом конструкторе.Они делают это с некоторыми огромными внутренними взломами, которые адаптированы для всех основных JVM.
Таким образом, ваш код будет выглядеть следующим образом:
public static function afunction(Class clazz) {
Objenesis objenesis = new ObjenesisStd();
ObjectInstantiator instantiator = objenesis.getInstantiatorOf(clazz);
Entity entity = (Entity)instantiator.newInstance();
// use it
String tableName = entity.getTableName();
...
}
Очевидно, вы должны кэшировать свои экземпляры, используя Map<Class,Entity>
, что практически сводит на нет затраты времени выполнения (один поиск в вашей карте кэширования).
Я использую Objenesis в одном собственном проекте, где он позволил мне создать красивый, свободный API.Это была такая большая победа для меня, что я смирился с этим взломом.Так что я могу сказать вам, что это действительно работает.Я использовал свою библиотеку во многих средах с различными версиями JVM.
Но это не очень хороший дизайн!Я советую не использовать такой хак, даже если он пока работает, он может остановиться в следующей JVM.И тогда вам придется молиться об обновлении Objenesis ...
Если бы я был вами, я бы переосмыслил свой замысел, ведущий ко всему требованию.Или отказаться от проверки времени компиляции и использовать аннотации.