Вот то, как я решил его, на основе ответов здесь:
Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT INTO \"TableName\"" +
"(\"Column1\", \"Column2\",\"Column3\",\"Column4\")" +
"VALUES ('value1',value2, 'value3', 'value4') RETURNING
\"TableName\".\"TableId\"";
PreparedStatement prpState = conn.prepareStatement(sql);
ResultSet rs = prpState.executeQuery();
if(rs.next()){
System.out.println(rs.getInt(1));
}
Основное значение Reflection заключается в том, что его можно использовать для проверки сборок, типов и элементов. Это очень мощный инструмент для определения содержимого неизвестной сборки или объекта, и его можно использовать в самых разных случаях.
Противники Reflection будут ссылаться на его медленность, что верно по сравнению со статическим выполнением кода - однако Reflection используется во всей платформе .NET, и при условии, что им не злоупотребляют, он может быть очень мощным инструментом в наборе инструментов.
Некоторые полезные приложения:
Определение зависимостей сборки
Типы местоположения, которые соответствуют интерфейс, производный от базового / абстрактного класса, и поиск членов по атрибутам
(Вонючий) тестирование - Если вы зависите от класса, который не поддается тестированию (т.е. t позволяет легко создать подделку) вы можете использовать Reflection для вставки поддельных значений в класс - это некрасиво и не рекомендуется, но может быть удобным инструментом в привязке.
Отладка - выгрузка списка загруженных сборок, их ссылок, текущих методов и т. Д.
Есть много применений для отражения:
Однако одно из моих любимых применений отражения - поиск свойств, которые были помечены атрибутами.
Например, я написал атрибуты, которые отмечают, какие свойства в моих классах должны быть проиндексированы с помощью Lucene. Во время выполнения я могу посмотреть на любой класс и выяснить, какие поля нужно проиндексировать, просто запросив у класса «отмеченные» свойства.
Отражение - это просто способ исследования объектов во время выполнения. Вы не должны использовать его, если вам это не нужно.
Как упоминалось выше, производительность снизится.
Еще одним большим преимуществом является то, что вы можете динамически загружать сборки, выполнять манипуляции со свойствами, даже если у вас может не быть возможности увидеть, что изменить и т. д.
Причин использовать это множество. Вот введение , если вам нужно.
Вы можете использовать отражение, например, для реализации системы плагинов. Вы просто ищите все DLL в папке и посредством отражения проверяете, реализуют ли они определенный интерфейс плагина. Это основная цель, для которой я использовал отражение, но я также использовал его для реализации общей сериализации домашних объектов, где производительность не была самой большой проблемой.
Отражение обычно используется в контейнерах IoC. Допустим, вы хотите зарегистрировать каждый конкретный класс, заканчивающийся словом «Контроллер». Отражение делает это проще простого.
Я также использовал отражение для управления частными полями при модульном тестировании классов.
Исходя из C ++ и имея потребность в некоторых простых иерархиях классов, я могу сказать, что ключевое слово is
бесценно!
class MenuItem : Item { }
foreach(Item items in parent.ChildItems) {
if (item is MenuItem) { /* handle differently */ }
}
PS Разве отражение не слишком дорогое, кстати?