[英]Java: Dynamically loading external classes
我正在编写一个将加载Java脚本的应用程序。 我目前有一个GUI,该GUI利用JFileChooser
允许用户从其计算机中选择脚本。 脚本文件可以在任何地方。 它不在类路径上。 只有一个File
对象来表示该脚本文件,我如何获得它的Class
表示形式?
我知道要加载一个类,您需要它的二进制名称,即in.this.format
。 但是,这样做的问题是我不知道脚本编写者如何打包它。 例如,他/她在开发脚本时可能会将脚本文件放入包foo.bar
。 下载此脚本并将其放在我的文档中后(即不在 foo/bar
),在不知道脚本已打包在foo.bar
情况下无法加载该脚本。 如果类名是Test
,我尝试创建一个URLClassLoader
做指向脚本文件new URLClassLoader(new URL[] { new URL(scriptFile.toURI().toURL()) })
和我做classLoader.loadClass("Test")
我将得到一个异常,说该类的名称错误,而正确的名称是foo.bar.Test
。 但是我应该如何提前知道呢?
这就是我现在所拥有的:
public class ScriptClassLoader extends URLClassLoader {
private final File script;
public ScriptClassLoader(File script) throws MalformedURLException {
super(new URL[] { script.toURI().toURL() });
this.script = script;
}
public Class<?> load() throws ClassNotFoundException {
String fileName = script.getName();
String className = fileName.substring(0, fileName.indexOf(".class"));
return loadClass(className);
}
}
人们如何在运行时加载不属于程序的类路径的脚本,并且该类的二进制名称未知?
如果您只需要从给定的.class文件中加载一个类,则无论此类的命名方式如何,您都可以自己加载数据,然后调用ClassLoader的defineClass()
方法:
RandomAccessFile raf = new RandomAccessFile(script, "r");
try {
byte[] classData = new byte[(int) raf.length()];
raf.readFully(classData);
return super.defineClass(null, classData, 0, classData.length);
} finally {
raf.close();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.