Загрузить скомпилированный класс во время выполнения

У меня есть класс, который выглядит так:

   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"

Благодарить!


person Ron Partuk    schedule 04.08.2018    source источник
comment
Этот файл .class, вероятно, бесполезен для Android, поскольку Android использует файлы DEX. Вы можете динамически загружать файл DEX ( сам не пробовал).   -  person Michael    schedule 04.08.2018
comment
Убедитесь, что android-developers.googleblog.com/ 2011/07/   -  person Veselin Davidov    schedule 04.08.2018
comment
Спасибо @VeselinDavidov, это очень помогает!   -  person Ron Partuk    schedule 04.08.2018