0

GroovyClassloader の拡張と loadclass メソッドのオーバーライド

lookupScriptFilesメソッドで" true"を作成loadClass()すると、スクリプトが実行され、別のパッケージの Groovy クラスを参照する import ステートメントは必要ありません。

GroovyClassloader を拡張し、loadclass メソッドをオーバーライドし、loadclass で引数lookupScriptFiles =true

これが真の場合、最初でも正常にコンパイルされます。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);
    }
}
4

1 に答える 1

0

あなたの質問が次のようになっていると仮定します:

に設定lookupScriptFilesした場合true、groovyスクリプトからimportステートメントを削除できますか?

それなら答えはノーです。クラスローダーは、認識していないスクリプトを検索しようとしますが、インポートして、各クラスを検索するパッケージを指定する必要があります。


アップデート

したがって、同じディレクトリに2つのgroovyファイルがあり、そのうちの1つにパッケージステートメントを任意に追加しています。

私はあなたがスクリプトから直接クラスをロードしていると仮定します(あなたがあなたの質問で言っていないさらに別のこと)

この場合、クラスにコンパイルする他のスクリプトを検索するようにクラスローダーに指示する必要があります。

そうしないと(これまで見てきたように)機能しません(インポートまたはインポートなし)

ただし、2つのGroovyファイルを同じフォルダーに入れ、そのうちの1つにパッケージ行を追加するだけでは、コーディングがひどくなります。何かが機能していることに驚いています。

于 2012-01-12T10:03:41.673 に答える