0

我使用 JavaCompiler 创建一个动态类。此类实现给定的接口。对于 JavaCompiler,我可以创建一个正确的类路径,以便编译器可以编译我的类。

 //creating the classpath from parent application to be same as the runtime's
 ClassLoader dummyc=getClass().getClassLoader();
 URLClassLoader urlClassLoader=(URLClassLoader)dummyc;
 URL[] urls=urlClassLoader.getURLs();
 String classpath = "";
 for (URL i : urls) {
     classpath += ";" + i.getPath().substring(1);
 }

我使用匿名类加载器:

   return new SecureClassLoader() {
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            byte[] b = javaClassObject.getBytes();
            return super.defineClass(name, javaClassObject.getBytes(), 0, b.length);
        }
    };

加载已编译的类,但是当我调用 loadClass 方法时出现此错误: NoClassDefFoundError: refac/IBewertungsAlgorithmus (wrong name: refac/MyClass)

是否可以为类加载器的编译器任务设置相同的类路径?

4

1 回答 1

0

我找到了解决方案。
我不仅需要使用 SecureClassLoader,还需要父类的 ClassLoader 及其所有依赖项。

public ClassLoader getClassLoader(Location location) {
    ClassLoader cl = DynamicCompiler.class.getClassLoader(); 
    return new SecureClassLoader() {
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
                byte[] b = javaClassObject.getBytes();
                if (name.contains("MyClass")){
                    return super.defineClass(name, javaClassObject.getBytes(), 0, b.length);
                } else {
                    return cl.loadClass(name);
                }

            }
        };
    }

findclass的第一次调用搜索编译的类,所以我必须调用SecureclassLoader的defineClass。
以下调用用于编译类的依赖项。要加载这些类,您需要父类加载器的 loadClass 方法。

于 2017-09-18T12:40:12.803 回答