java - 在运行时加载编译的类
问题描述
我的课看起来像这样:
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)
我知道问题不在于路径,因为如果我从 android External Storage 的根目录中删除 Tests.class 会得到:“ java.lang.ClassNotFoundException: Tests ”
感谢!
解决方案
推荐阅读
- ruby-on-rails - PandocRuby:设置默认选项(以便在我调用#convert 时使用它们)?
- jquery - 检查 div 是否包含与另一个 div 中的 aria-label 值相同的文本
- vue.js - Axios / Json for 循环,如何防止此错误?
- visual-studio - 如何在 Visual Studio 2019 中更改默认浏览器?
- python - 如何在matplotlib中将刻度设置为2的幂?
- python - 我无法更改 numpy 数组的形状
- vba - 如何将两张 PowerPoint 幻灯片导出为 PDF 文件?
- android - 重复条目错误重复条目:android/support/v4/app/INotificationSideChannel$Stub$Proxy.class
- asp.net-core - Redis 与缓存的连接失败
- python - 如何在 python 中的 Requests.PUT 中传递正文参数?