lookupScriptFiles "true" в методе loadClass()

Расширенный GroovyClassloader и переопределить метод loadclass

Если я сделаю lookupScriptFiles "true" в loadClass() метод, который запускает скрипт, и не требует оператора импорта, ссылающегося на класс groovy в другом пакете

я расширил GroovyClassloader и переопределил метод loadclass в аргументе loadclass lookupScriptFiles =true

Когда это так, он успешно компилируется даже first.groovy без оператора import

когда lookupScriptFiles=false выдает ошибку компиляции, как и ожидалось.

my source code snippet

    C:\>cat first.groovy
def cos=new Second()
==============================================================
C:>cat Second.groovy
package com.test
class Second
{
Second()
{
        println "Anish"
}

}
=========================================================

C:\bin>echo %CLASSPATH%
C:\zGroovy\bin;C:\vsexclude\opt\groovy-1.7.2\embeddable\groovy-all-1.7.2.jar
===============================================
C:\vsexclude\trees\bac-4.2\workspace\zGroovy\bin>java GCtest
path------>>C:\first.groovy
Anish
=================================

import groovy.lang.GroovyClassLoader;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilerConfiguration;
/**
 * @author Anish
 */
public class GCloader extends GroovyClassLoader {
    public GCloader(ClassLoader parent) {
        super(parent, new CompilerConfiguration());
    }
    @Override
    public Class<?> loadClass(final String name, boolean lookupScriptFiles,
            boolean preferClassOverScript, boolean resolve)
            throws ClassNotFoundException, CompilationFailedException {
        //return loadFiles(name, true, preferClassOverScript, resolve);
        return super.loadClass(name, true,
                preferClassOverScript, resolve);
    }
}

1 ответ

Предполагая, что ваш вопрос:

Если я установлю lookupScriptFiles в trueможно удалить операторы импорта из моих скриптов groovy?

Тогда ответ - нет. Загрузчик классов попытается найти сценарии, о которых он не знает, но вам все равно потребуется импорт, чтобы указать, в каких пакетах искать каждый класс.


Обновить

Итак, у вас есть два groovy файла в одном каталоге, в один из которых вы произвольно добавили оператор пакета.

Я предполагаю, что вы загружаете классы прямо из сценариев (еще одна вещь, которую вы не говорите в своем вопросе)

Если это так, то вам нужно указать загрузчику классов, чтобы он поискал другие сценарии для компиляции в классы.

Если вы этого не сделаете - как вы видели - это не будет работать (импорт или импорт)

Тем не менее, помещать два одинаковых файла в одну папку и просто добавлять строку пакета в один из них - ужасная практика кодирования, и я удивлен, что у вас все получилось

Другие вопросы по тегам