level36.lesson10.task01

Выдает null. Помогите понять, что не так.

package com.javarush.test.level36.lesson10.task01;

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/* Найти класс по описанию
1. Реализует интерфейс Queue
2. Используется при работе с трэдами
3. Из этой очереди элементы могут быть взяты только тогда, когда они заэкспарятся, их время задержки истекло
4. Головой очереди является элемент, который заэкспарился раньше всех
*/
public class Solution {
    public static void main(final String[] args) {
        System.out.println(getExpectedClass());
    }
    final String packageName = Queue.class.getPackage().getName().replaceAll("\\.", "/");
    public static Class getExpectedClass() {
        final Set<Class> classes = new HashSet<>();
        final String packageName = Queue.class.getPackage().getName().replaceAll("\\.", "/");

        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
        final URL enn = cl.getResource(packageName + "/Queue.class");
        final String jarFilePath = enn.toString().split("file:/")[1].split("!/" + packageName)[0];

        try {
            final JarFile jarFile = new JarFile(jarFilePath);
            final List<? extends JarEntry> jarEntryList = Collections.list(jarFile.entries());

            for (final JarEntry jarEntry : jarEntryList) {
                if (jarEntry.isDirectory()) continue;
                final String fileName = jarEntry.getName();
                if (fileName.startsWith(packageName + "/concurrent") && fileName.endsWith(".class") && !fileName.contains("$")) {
                    final String classPath = fileName.substring(0, fileName.length() - 6).replaceAll("[\\|/]", ".");
                    classes.add(Class.forName(classPath));
                }
            }
        } catch (final IOException | ClassNotFoundException ignored) {
        }

        for (final Class cls : classes) {
            if (Queue.class.isAssignableFrom(cls) && cls.getEnclosingClass() == null && !cls.isInterface()) {
                final Method[] methods = cls.getDeclaredMethods();
                for (final Method m : methods) {
                    if (m.getName().toLowerCase().contains("expired")) {
                        return cls;
                    }
                }
            }
        }
        return null;
    }
}


Выбрасывается исключение на строчке
final JarFile jarFile = new JarFile(jarFilePath);


Я уж от отчаяния попробовал через ZipFile, но один чёрт :).

13 комментариев

Peras
попробуй прочитать файл по jarFilePath. Возможно дело в кодировке или в Fileseparator'e… Если читается, значит все нормально.
realcorwin
Такое ощущение, что в «C:/Program%20Files/Java/jdk1.8.0_131/jre/lib/rt.jar» не нравится "%20".
realcorwin
Да, в этом и заключалась проблема.
lichMax
не помню точно, но я вроде бы просто вставлял название класса в возвращаемое значение. Из этих всех задач, я вроде бы только в одной или двух применял рефлексию. Тут слишком неконкретное условие, чтобы вручную искать этот класс по библиотеке
realcorwin
Так все обычно и делают. Нет смысла сильно заморачиваться.
lichMax
то-то и оно. А зачем тогда весь этот код?
realcorwin
А поиграться? :)
lichMax
Ага) это называется, играться за деньги заказчика. ;)
Надо заранее привыкать искать наиболее эффективные пути решения задач.
realcorwin
Заказчик в данном случая я сам, и на себя не обижусь :).
lichMax
Ну в будущем чаще всего будет по-другому. Поэтому советую не сильно вдаваться в эти развлечения.
realcorwin
Скажите, вы 39 задачу решали? Не могу пройти первое задание.
lichMax
  • lichMax
  • 0
  • Комментарий отредактирован 2017-11-06 10:03:40 пользователем lichMax
Скорее всего, нет. А про что она? Я по номерам не помню.
realcorwin
LogParser. Но я её уже победил.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.