Я только что выпустил быстрый и легкий классный сканер классов (git repo here), который не вызывает загрузчик классов для загрузки классов в пути к классам для определения подклассов, суперклассов, аннотаций и т. Д., Но, скорее, читает бинарные заголовки classfile напрямую (вдохновил но проще, чем сканер маршрутов rmueller, связанный в другом комментарии).
Сканер класса маршрута может находить классы в пути к классам, которые расширяют данный суперкласс, которые реализуют данный интерфейс или имеют определенную аннотацию класса, и могут находить файлы в пути к классам любого типа, путь которого соответствует заданному регулярному выражению ,
Вот пример использования:
new FastClasspathScanner(new String[]
{ "com.xyz.widget", "com.xyz.gizmo" }) // Whitelisted package prefixes
.matchSubclassesOf(DBModel.class,
// c is a subclass of DBModel
c -> System.out.println("Found subclass of DBModel: " + c.getName()))
.matchClassesImplementing(Runnable.class,
// c is a class that implements Runnable
c -> System.out.println("Found Runnable: " + c.getName()))
.matchClassesWithAnnotation(RestHandler.class,
// c is a class annotated with @RestHandler
c -> System.out.println("Found RestHandler annotation on class: "
+ c.getName()))
.matchFilenamePattern("^template/.*\\.html",
// templatePath is a path on the classpath that matches the above pattern;
// inputStream is a stream opened on the file or zipfile entry.
// No need to close inputStream before exiting, it is closed by caller.
(templatePath, inputStream) -> {
try {
String template = IOUtils.toString(inputStream, "UTF-8");
System.out.println("Found template: " + absolutePath
+ " (size " + template.length() + ")");
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.scan(); // Actually perform the scan
Сканер также записывает последнюю последнее изменение метки времени любого файла или каталога столкнулся, и вы можете увидеть, что если последняя последнее изменение временной метка увеличилась (с указанием что-то на пути к классам обновлено) по телефону:
boolean classpathContentsModified =
fastClassPathScanner.classpathContentsModifiedSinceScan();
Это может быть использовано для того, чтобы динамический класс перегрузка, если что-то на пути к классам обновляются, например, для поддержки горячей замены классов обработчика маршрута в веб сервер. Вышеупомянутый вызов в несколько раз быстрее, чем исходный вызов функции scan(), так как нужно проверять только временные метки изменения.
Спасибо за информацию. Вы также знаете, как сканировать путь к классам, чьи поля имеют пользовательскую аннотацию? – Javatar 2012-12-12 14:10:40
@Javatar Используйте API отражения Java. .class.getFields() Для каждого поля вызовите getAnnotation () –
2013-01-21 02:59:57
@ArthurRonaldFDGarcia, как я могу сканировать `sub package` так? – CycDemo 2014-01-30 08:30:42