2016-06-15 2 views
0

С этими словами я могу найти имя пакета в приложенииJava отражение без файла

Package pack = Item.class.getPackage(); 

Но все примеры, которые я могу найти здесь или в другом месте, чтобы найти классы в использовании пакета файлы для загрузки баночки и посмотреть в это. У меня есть способ gat список классов в активном проекте без файла?

[EDIT] есть othere ответов здесь, но все они не работали для меня

[Редактировать] это по некоторым причинам это было блокированными для ответов. вот решение

private static Set<Class<? extends Object>> getClassesInPackage(String packagename) { 

    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>(); 
    classLoadersList.add(ClasspathHelper.contextClassLoader()); 
    classLoadersList.add(ClasspathHelper.staticClassLoader()); 
    Reflections reflections = new Reflections(new ConfigurationBuilder() 
      .setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner()) 
      .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) 
      .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(packagename)))); 

    Set<Class<?>> classes = reflections.getSubTypesOf(Object.class); 
    return classes; 
} 
+0

Программным нет. Вам нужно проверить файловую систему (связанную с classpath вашего приложения), найти файлы .class и открыть .jar для извлечения .class в jar –

+0

см. Последнее редактирование – user3732793

+0

Класс ClasspathHelper читает .class и .jar для вас –

ответ

1

Это невозможно из-за динамической природы загрузчиков классов. Classloaders не должны выставлять все классы, которые у них есть. Единственный способ - написать свой собственный загрузчик классов и играть с порядком загрузки классов, поэтому у вашего загрузчика классов будет больше информации.

Однако, here - это библиотека, которая потенциально может помочь вам получить классы в пакете (никогда не использовала ее, но обнаружила ее только сейчас по поисковому запросу).

что-то, что икэ:

Reflections reflections = new Reflections("my.project.prefix"); 

Set<Class<? extends Object>> allClasses = 
    reflections.getSubTypesOf(Object.class); 
+0

Я заменил имя пакета pack.getName(), которое произвело это в журналах ... INFO org.reflections.Reflections - отражения потребовались 62 мс для сканирования 2 urls, производя 0 ключей и 0 значений .... однако он выглядит перспективным. Я буду ближе смотреть на библиотеку, спасибо – user3732793

Смежные вопросы