2

ライブラリを作成し、その API メソッドの 1 つをClassパラメーターとして受け取り、このメソッドの本体でこのクラスのインスタンスを作成します。

void foo(Class scriptClass) {
  Script script = scriptClass.newInstance();
  // do stuff with the script object
}

問題は、whileが とは異なるクラス ローダーによってロードされたときに取得したクラスscriptClassの子であることです。このような衝突を解決する通常の方法は何ですか?ScriptClassCastExceptionscriptClassScript

4

2 に答える 2

2

クラスが同じでない限り、キャストできません。つまり、クラスの同じインスタンスであり、同じクラスローダーによってロードされます。

共通クラスローダー

子クラスローダーがこのクラスを使用groovy.Scriptする場合、それは共通クラスです。

を使用する場合は、次のURLClassLoaderコンストラクターURLClassLoader(URL[] urls, ClassLoader parent)を使用します。スクリプトが既存のクラスを使用するようにします。

その他のクラスローダー

上記が不可能な場合は、リフレクションを使用できます (JRE クラスは一般的であるため)。ただし、これは多くの定型コードであり、最小限に抑える必要があることに注意してください。

したがって、肝心なのは、クラスローダーの構造を見直して、共通のものを共通の場所に配置することです。

于 2012-08-20T12:45:20.313 に答える
0

「scriptClass」が正確に「スクリプト」なのか、それともそのサブクラスなのかは不明です。後者の場合、基本的には、「scriptClass」をロードする前に、「スクリプト」が JVM によってロードされていることを確認する必要があります。「スクリプト」がまだロードされていない場合、「奇妙な」クラスローダーがそれ自体をロードし、問題を引き起こします。すでにロードされている場合は、(システム クラス ローダーによって) すでにロードされているバージョンがどちらの場合にも使用されます。

于 2012-08-20T12:46:03.103 に答える