クラスローダを使用して Groovy クラスを名前でロードしようとしていますが、クラスが別のクラスの静的内部クラスへの参照を持っている場合、クラスのロードに失敗します。
私のグルーヴィーなクラスの中には、次のものがあります。
def classLoader = getClass().classLoader
try {
classLoader.loadClass( "com.test.TestClass" )
} catch(Throwable e) {
Sigil.logger.error("Error loading class: $it >> ${e.message}", e)
}
上記では、私の Groovy ファイル TestClass の内部に静的内部クラスがあり、別のファイルの静的内部クラスを拡張しています。上記のコードを実行しようとすると、次のメッセージが表示されます。
ERROR [05 Aug 2013 06:53:28,851] (invoke0:?) - Error loading class: com.test.TestClass >> startup failed:
unable to resolve class UserValidity.Validator
@ line 85, column 5.
public static class Validator extends UserValidity.Validator{
^
1 error
Groovyでの静的内部クラスとクラスのロードを処理する際に問題に遭遇した人はいますか? クラスはすべて正しくコンパイルされ、単体テストが実行されます。クラスローダーでクラス TestClass を明示的にロードしようとすると、必要に応じてソースツリーから他の必要なクラスもロードされると思いましたか?
アップデート:
ロードに失敗しているクラスのスニペットを次に示します。
class TestClass{
//... Other normal class stuff here
public static class Validator extends UserValidity.Validator
@Override
def validate(u) {
def result = super.validate(u)
if(!u.valid ){
result += [isValid:false]
}
result
}
}
}
そして、これは UserValidity.Validator への参照を解決できないと言って失敗します。これも非常に単純です。
class UserValidity {
//normal class stuff here
public static class Validator {
def validate(u){
//do validation stuff
result
}
}
}
どちらも通常の groovy クラスです。
更新 2:
UserValidity.Validator
静的内部クラスをスタンドアロン クラスに抽出し、それを静的内部クラスで拡張するだけTestClass
で動作するように見えるので、内部クラスの親が別の内部クラスであることに問題があるようです。