У меня есть класс, который выглядит так:
public class Tests {
public String ReturnString(){
return "from Tests";
}
}
Я скомпилировал его в «Tests.class» и поместил в корень диска «C». Я могу отлично загрузить его с помощью intellij ide на своем компьютере следующим образом:
try{
String classToLoad = "Tests";
File file = new File("C:\\");
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(classToLoad);
Object instance = cls.newInstance();
Method m = cls.getMethod("ReturnString");
String returndString = (String) m.invoke(instance, null);
System.out.println(returndString);
} catch ( ClassNotFoundException | MalformedURLException |
NoSuchMethodException | InstantiationException |
InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
Но когда я помещаю тот же Tests.class в корень внешнего хранилища Android (или любого каталога) и пытаюсь загрузить его тем же методом:
try {
String classToLoad = "Tests";
File file = new File(Environment.getExternalStorageDirectory().getPath());
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(classToLoad);
Object instance = cls.newInstance();
Method m = cls.getMethod("ReturnString");
String returndString = (String) m.invoke(instance, null);
System.out.println(returndString);
}
catch ( ClassNotFoundException | MalformedURLException | NoSuchMethodException | InstantiationException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
Я получу:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.net.URLConnection java.net.URL.openConnection()' on a null object reference
at java.net.URLClassLoader.getPermissions(URLClassLoader.java:641)
at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:447)
at java.net.URLClassLoader.-wrap0(URLClassLoader.java)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:356)
at java.security.AccessController.doPrivileged(AccessController.java:67)
at java.security.AccessController.doPrivileged(AccessController.java:92)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
я знаю, что проблема не в пути, потому что, если я удалю Tests.class из корня внешнего хранилища Android, я получу: "java.lang.ClassNotFoundException: Tests"
Благодарить!
.class
, вероятно, бесполезен для Android, поскольку Android использует файлы DEX. Вы можете динамически загружать файл DEX ( сам не пробовал). - person Michael   schedule 04.08.2018