Проблема с рефлексией в .jar файле

208
08 мая 2018, 01:34

у меня следующая проблема: созданный проект и intellij находит все классы в проекте посредством рефлексии, но при собирании проекта в .jar файл рефлексия перестает работать. Подскажите как решить данную проблему!

Вот весь мой класс:

public class ReflectionUtil {
    private static Logger logger = Logger.getLogger(ReflectionUtil.class);
    private static ArrayList<Class> classes;
    private final static String PACKAGE_INFO = "package-info";
    static {
        try {
            classes = findAllClasses();
            for (Class c : classes) {
                System.out.println(c.getCanonicalName());
            }
        } catch (ClassNotFoundException | IOException e) {
            throw new RuntimeException("problems with class loading");
        }
    }
    public static Map obtainMap(DBType type, Class clazz) {
        for (Class c : classes) {
            if (PACKAGE_INFO.equals(c.getSimpleName())) {
                Annotation ann = c.getAnnotation(PackageAnnotation.class);
                if (ann != null) {
                    PackageAnnotation annotation = (PackageAnnotation) ann;
                    if (annotation.type() == type && annotation.clazz() == clazz) {
                        int lastPoint = c.getName().lastIndexOf(".");
                        String path = c.getName().substring(0, lastPoint);
                        try {
                            return fillMap(path, clazz);
                        } catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
                            throw new RuntimeException("can't load classes");
                        }
                    }
                }
            }
        }
        throw new RuntimeException("Loaders or Printers are not found");
    }
    private static Map fillMap(String path, Class clazz)
            throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        List<Class> packClasses = new ArrayList<>();
        for (Class c : classes) {
            String className = c.getName();
            if (className.startsWith(path)) {
                packClasses.add(c);
            }
        }
        Map map = new HashMap();
        for (Class c : packClasses) {
            Annotation a = c.getAnnotation(clazz);
            if (a != null) {
                Class<?> type = a.annotationType();
                Method m = type.getMethod("element");
                String[] keys = (String[]) m.invoke(a);
                Object value = c.newInstance();
                for (String k : keys) {
                    map.put(k, value);
                }
            }
        }
        return map;
    }
    private static ArrayList<Class> findAllClasses() throws ClassNotFoundException, IOException {
        String pack = ReflectionUtil.class.getPackage().getName();
        String[] directories = pack.split("\\.");
        String path = directories[0];
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        assert classLoader != null;
        Enumeration<URL> resources = classLoader.getResources(path);
        List<File> dirs = new ArrayList<>();
        while (resources.hasMoreElements()) {
            String path2 = resources.nextElement().getPath();
            File directory = new File(URLDecoder.decode(path2, "UTF-8"));
            dirs.add(directory);
        }
        ArrayList<Class> classes = new ArrayList<>();
        for (File directory : dirs) {
            classes.addAll(findClassesInDirectory(directory, path));
        }
        return classes;
    }
    private static List<Class> findClassesInDirectory(File directory, String packageName) throws ClassNotFoundException {
        List<Class> classes = new ArrayList<>();
        if (!directory.exists()) {
            return classes;
        }
        File[] files = directory.listFiles();
        assert files != null;
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains(".");
                classes.addAll(findClassesInDirectory(file, packageName + "." + file.getName()));
            } else if (file.getName().endsWith(".class")) {
                classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
            }
        }
        return classes;
    }
}
READ ALSO
Извлечение autogererated-ключа используя PreparedStatement или JdbcTemplate

Извлечение autogererated-ключа используя PreparedStatement или JdbcTemplate

Пожалуйста, объясните как можно используя каждый из этих способов извлекать ключК пример есть:

202
залить фигуру картинкой java

залить фигуру картинкой java

Задача учебная на javaВ ней есть объект, который выглядит как круг и двигается за целью (типа игра)

189
Как через уведомление вызвать метод из службы в другом активити

Как через уведомление вызвать метод из службы в другом активити

Как через кнопку в уведомлении вызвать метод processIntent() в MainActivityВ уведомлении я прописал кнопки

221
log4j в простом web application (jsp, servlets). Проблема

log4j в простом web application (jsp, servlets). Проблема

В простое веб приложение подключил log4j

169