1

ScriptEngine を自分のコードベースに組み込むことに非常に興奮しており、これを使用して、永続化されたスクリプトからその場でインターフェイスの実装を構築する予定です。

スクリプト データを Java インターフェイス インスタンスに変換する一般的な実装の JUnit テスト ケースを作成しています。Invocable.getInterface(Class<?>)そのインターフェイスのオブジェクトと見なされるために、スクリプトにインターフェイス全体を実際に実装する必要がないことがわかっているようです。ドキュメントによるとgetInterface、完全な実装が指定されていない場合、 null を返すと期待できると思いました。

Returns:
An instance of requested interface - null if the requested interface is unavailable, 
i. e. if compiled functions in the ScriptEngine cannot be found matching the ones in the requested interface.  

オブジェクトを使用して結果をClass<?>呼び出すと、常に true が返されるようです。動的に型付けされたスクリプト言語の実装を静的に型付けされた Java インターフェースにマッピングするには、概念的な課題があると思います。ただし、このオブジェクトで実装されていないメソッドを呼び出そうとすると、.isInstance(Object)Invocable.getInterface(Class<?>)NoSuchMethodException

説明に役立つコードの一部を次に示します。

テスト

//Data doesnt implement the interface

threwExpectedException = false;

    scriptData = ""; //No actual code, shouldn't be a Queue implementation

try{
    Queue queue = scriptToInterfaceFactory.convertScript(scriptLanguage, scriptData, scriptSignature, Queue.class);
    queue.add(""); //Sanity check. Don't want to get here. Throws NoSuchMethodException
} catch(ScriptNotSupportedException e) { threwExpectedException = true; }

assertTrue(threwExpectedException);

スクリプト関連スニペットの変換

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine scriptEngine = mgr.getEngineByName(engineName);

scriptEngine.eval(scriptData);

Invocable inv = (Invocable) scriptEngine;

/* get interfaceClass object from engine. The interface methods
* should be implemented by script functions with the matching name.
* Will return null if it cannot cast to the interface */
Object interfaceObject = inv.getInterface(interfaceClass);

if(interfaceObject == null) {
    log.trace("Interface Object retreived from script is not the same type as the expected interface");
    throw new ScriptNotSupportedException("Interface Object retreived from script is not the same type as the expected interface");
}

return interfaceClass.cast(interfaceObject);

結果

この行にヒットqueue.add(""); //Sanity check. Don't want to get here. Throws NoSuchMethodExceptionするか、そのサニティ チェックを削除すると、基本的な AssertTrue が失敗します。これは、Queue オブジェクトが返されるためです。

質問

ScriptEngine/Invocable の getInterface(Class) メソッドから取得されたオブジェクトが実際に Class インターフェイスの完全な実装を返したことを確認するにはどうすればよいでしょうか?

4

0 に答える 0