我想加载特定的罐子ScriptEngineManager
using 特定的类加载器 https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngineManager.html#ScriptEngineManager(java.lang.ClassLoader)
此构造函数使用服务提供者机制加载对给定 ClassLoader 可见的 ScriptEngineFactory 的实现。
我尝试创建时出现的问题类加载器 https://stackoverflow.com/questions/6219829/method-to-dynamically-load-java-class-files
File file = new File("c:\\myclasses\\");
try {
// Convert File to a URL
URL url = file.toURI().toURL(); // file:/c:/myclasses/
URL[] urls = new URL[]{url};
// Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls)
我还参加了不在课堂上的课程,例如 Spring
Class cls1 = cl.loadClass("org.springframework.http.HttpStatus");
如何创建仅包含特定文件夹类的干净类加载器?
EDIT
如果不可能,我可以在groovy脚本中使用相当于Rhino的东西吗类快门 https://www.programcreek.com/java-api-examples/?api=org.mozilla.javascript.ClassShutter
private static void setJavaClassesVisibleInvisibleSandbox(Context cx)
{
cx.setClassShutter(new ClassShutter()
{
public boolean visibleToScripts(String className)
{
// No Java classes allowed inside scripts
EDIT
当尝试@Vinz243时CustomClassLoader
解决方案无法从特定文件夹加载类文件或 jar 文件的类,即使尝试过rt.jar
java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at com.CustomClassLoader.loadClass(CustomClassLoader.java:15)
正如 javadoc 中所指定的:
public URLClassLoader(URL[] urls)
为指定的 URL 构造一个新的 URLClassLoader使用默认委托父类ClassLoade河将按照为类和资源指定的顺序搜索 URL第一次在父类加载器中搜索之后。任何以“/”结尾的 URL 都被假定为引用目录。否则,假定 URL 引用 JAR 文件,该文件将根据需要下载并打开。
所以你可以尝试延长ClassLoader
因为负责加载父类的机制在里面java.lang.ClassLoader#loadClass(java.lang.String, boolean)
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
EDIT
未经测试,但类似的东西应该可以完成工作:
class CustomClassLoader extends URLClassLoader {
public CustomClassLoader (URL[] urls) throws NoSuchMethodException {
super(urls);
}
@Override
protected Class<?> loadClass (String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {
Class<?> aClass = findClass(name);
if (resolve) {
resolveClass(aClass);
}
return aClass;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)