通常スクリプトはJavaバイトコードにコンパイルされて実行されますが、スクリプトが実行されるまでの手順はContextの属性(pnutsImpl)を設定することでカスタマイズできます。 たとえば、Javaバイトコードにコンパイルせずに実行したり、コンパイルしたものをキャッシュして二度目以降はコンパイルしないようにすることができます。
pnuts.lang.Implementationインタフェースは、スクリプトインタプリタ実装の抽象インタフェースを定義します。 Implementation のインスタンスは、あるContextに対応づけられます。 Context.setImplementation() メソッドと Context.getImplementation() メソッドは、それぞれその settter、getter メソッドです。
- pnuts.lang.PnutsImpl
- ASTインタプリタ。
- pnuts.compiler.CompilerPnutsImpl
- On-the-fly コンパイラ。pnutsコマンドを使った場合のデフォルトクラス。
- pnuts.ext.CachedPnutsImpl
- Mixed モード。コンパイル(またはパーズ)されたスクリプトをキャッシュして再利用する。
- pnuts.security.SecurePnutsImpl
- セキュアモード。Java2 Security APIを使ってスクリプトを安全に実行する。
- pnuts.security.JAASPnutsImpl
- JAASを使ってスクリプトを安全に実行する。
実行効率の観点でのImplementation クラスの選び方については、「パフォーマンス向上のためのヒント」をご覧ください。
import pnuts.lang.*; import pnuts.ext.*; Context context = new Context(); context.setImplementation(new CachedPnutsImpl()); Pnuts.loadFile(fileName, context);
SecurePnutsImplおよびJAASPnutsImpl は、他のPnutsImplサブクラスにセキュリティ機能を追加するためのラッパクラスです。スクリプトがリモートホストからダウンロードされた場合でも安全に読み込むことができます。詳細は、「コードソースに基づく安全なスクリプティング」と「ユーザ認証に基づく安全なスクリプティング」をご覧下さい。
context.setImplementation(new SecurePnutsImpl(new CompilerPnutsImpl()));
Pnuts.load(new URL("..."), context);
Pnuts APIが最初に読み込まれる時に、プロパティpnuts.lang.defaultPnutsImplがPnutsImplのサブクラスである場合、そのクラスがデフォルトのPnutsImplとして使われます。
SecurePnutsImplとJAASPnutsImplは、デフォルトコンストラクタを持たないので、このプロパティで指定して使うことはできません。
どのImplementationが使われているかを知るには、Context.getImplementation()を呼び出します。
> getContext().getImplementation() pnuts.compiler.CompilerPnutsImpl@1764be1 >