Я хочу загрузить некоторые файлы класса из 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)
Я не совсем понимаю, почему мой класс больше не найден.