创建仅包含特定文件夹内的类的类加载器

2024-02-15

我想加载特定的罐子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(使用前将#替换为@)

创建仅包含特定文件夹内的类的类加载器 的相关文章

随机推荐