Этот пример относится к Spring 4, но вы также можете найти сканер классов в более ранних версиях.
// create scanner and disable default filters (that is the 'false' argument)
final ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
// add include filters which matches all the classes (or use your own)
provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));
// get matching classes defined in the package
final Set<BeanDefinition> classes = provider.findCandidateComponents("my.package.name");
// this is how you can load the class type from BeanDefinition instance
for (BeanDefinition bean: classes) {
Class<?> clazz = Class.forName(bean.getBeanClassName());
// ... do your magic with the class ...
}
Примечание. В версии 14 API по-прежнему отмечен как @Beta , поэтому будьте осторожны в производственном коде.
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
for (final ClassPath.ClassInfo info : ClassPath.from(loader).getTopLevelClasses()) {
if (info.getName().startsWith("my.package.")) {
final Class<?> clazz = info.load();
// do something with your clazz
}
}
Я утверждал бы, что глотание является меньшим из этих двух зла в этом сценарии, поскольку лучше повысить оригинал Exception
- протест: , если , возможно, отказ чисто расположить самостоятельно довольно не чинят очень важный (возможно, если TransactionScope
не мог бы расположить, так как это могло бы указать на отказ отката).
См. здесь для большего количества мыслей об этом - включая идею метода обертки/расширения:
using(var foo = GetDodgyDisposableObject().Wrap()) {
foo.BaseObject.SomeMethod();
foo.BaseObject.SomeOtherMethod(); // etc
} // now exits properly even if Dispose() throws
, Конечно, Вы могли также сделать некоторую причуду, где Вы повторно бросаете составное исключение и с оригиналом и с секунда (Dispose()
) исключение - но думаете: у Вас могли быть приблизительно using
блоки... это быстро станет неуправляемым. В действительности исходным исключением является интересное.
Руководство по проектированию Платформы (2 <глоток> без обозначения даты глоток> редактор) имеет это как (В§9.4.1):
ИЗБЕГАЮТ , выдача исключения из Располагает (bool) кроме под критическими ситуациями, где содержание процесса было повреждено (утечки, непоследовательное общее состояние, и т.д.).
Комментарий [Редактирование]:
Dispose(bool)
может быть назван от финализатора, бросающий от финализатора плохая идея и заблокирует другие объекты от того, чтобы быть завершенным. Мой представление: сбегающие исключения Располагают, должны только быть те, как в инструкции, что как достаточно катастрофический, что никакая дальнейшая надежная функция не возможна от текущего процесса.
Dispose
должен быть разработан, чтобы сделать его цель, расположив объект. Эта задача безопасна и не выдает исключения большую часть времени . Если Вы видите, что себя выдаете исключения от Dispose
, необходимо, вероятно, думать дважды, чтобы видеть, делаете ли Вы слишком много материала в нем. Около этого я думаю Dispose
, должен рассматриваться как все другие методы: обработайте, если можно сделать что-то с ним, позвольте ему пузырь, если Вы не можете.
РЕДАКТИРОВАНИЕ: Для указанного примера я написал бы код так, чтобы мой код не вызывал исключение, но очистка TcpClient
могла бы вызвать исключение, которое должно быть допустимым, чтобы распространить , по-моему (или обработать и повторно бросить как более универсальное исключение, точно так же, как любой метод):
public void Dispose() {
if (tcpClient != null)
tcpClient.Close();
}
Однако точно так же, как любой метод, если Вы знаете tcpClient.Close()
, мог бы выдать исключение, которое должно быть проигнорировано (не имеет значения), или должен быть представлен другим объектом исключения, Вы могли бы хотеть поймать его.
Я, вероятно, использовал бы вход для получения детали о первом исключении, затем позволил бы второму исключению быть повышенным.
Высвобождение средств должно быть "безопасной" операцией - в конце концов, как я могу восстановиться с неспособности выпустить ресурс? так выдача исключения от Располагает, просто не имеет смысла.
Однако, если я обнаруживаю внутри, Располагают то состояние программы, повреждается, лучше выдать исключение затем для глотания его, лучше для сокрушения теперь затем, чтобы продолжить работать и приводить к неправильным результатам.