JAVA URLClassLoader Java 11 файл не найден исключение - PullRequest
0 голосов
/ 16 марта 2019

Я хочу загрузить некоторые файлы класса из jar во время работы моей java-программы.До Java 8 я делал это с помощью следующего кода:

public class MiKoLoader {

    public void loadJar(File jarfile)
    {
        try {
        URL url = jarfile.toURI().toURL();
        URLClassLoader uc = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Method m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        m.setAccessible(true);
        m.invoke(uc, url);
    } catch (MalformedURLException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }


    public Object findObject(String klasse)
    {
        Class<?> c;
        try {
            c = Class.forName(klasse);
            return c.newInstance();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

public void methodeAufObjektAnwenden(String methodenname, String klasse, Object o, Object...params)
    {
        Class<?>[] klassen = null;

        if (params!=null)
        {
            klassen = new Class<?>[params.length];
            for (int i=0; i<params.length; i++)
            {
                klassen[i]=params[i].getClass();
            }
        }

        try {
            Method m = Class.forName(klasse).getMethod(methodenname, klassen);
            m.invoke(o, params);
        } catch (NoSuchMethodException | SecurityException | ClassNotFoundException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

У меня есть JAR-файл, который содержит класс «Auto» и начальный класс, который выполняет некоторые тесты.

MiKoLoader m = new MiKoLoader();
    m.loadJar(jar);
    Object auto = m.findObject("Auto");
    m.methodeAufObjektAnwenden("fahren", "Auto", auto, null);
    m.methodeAufObjektAnwenden("fahren", "Auto", auto, new String("blau"));

В Java 9 и выше мне пришлось изменить метод loadJar на

public void loadJar(File jarfile)
{

    try {
        URL url = jarfile.toURI().toURL();
        URLClassLoader uc = new URLClassLoader(new URL[0]);
        Method sysMethod = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
        sysMethod.setAccessible(true);
        sysMethod.invoke(uc, new Object[]{url});
    } catch (MalformedURLException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

При попытке запустить я получаю следующие предупреждения и исключенияновый код:

ПРЕДУПРЕЖДЕНИЕ: произошла недопустимая операция отражающего доступа ПРЕДУПРЕЖДЕНИЕ: незаконный отражающий доступ MiKoLoader (файл: / home / mk / nas / home / workspace% 20rt / asvspace / MiKoLoader / bin/) к методу java.net.URLClassLoader.addURL (java.net.URL) ПРЕДУПРЕЖДЕНИЕ. Пожалуйста, рассмотрите возможность сообщения об этом сопровождающим MiKoLoader. ПРЕДУПРЕЖДЕНИЕ. Используйте --illegal-access = warn, чтобы включить предупреждения о дальнейших недопустимых операциях с отражающим доступом. ПРЕДУПРЕЖДЕНИЕ:Все незаконные операции доступа будут отклонены в следующем выпуске

java.lang.ClassNotFoundException: Auto at java.base / jdk.internal.loader.BuiltinClassLoader.loadClass (BuiltinClassLoader.java:583) в java.base /jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass (ClassLoaders.java:178) в java.base / java.lang.ClassLoader.loadClass (ClassLoader.java:521) в java.base / java.lang.Class.forName0 (собственный метод) в java.base / java.lang.Class.forName (Class.java:315) в MiKoLoader.findObject (MiKoLoader.java:43) в Starter.work (для начинающих).java: 16) at Starter.main (Starter.java:9)

Я не совсем понимаю, почему мой класс больше не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...