lookupScriptFiles "true" в методе loadClass () - PullRequest
0 голосов
/ 12 января 2012

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

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

Я расширил 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 Ответ

0 голосов
/ 12 января 2012

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

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

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


Обновление

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

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

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

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

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

...