Telosysテンプレートで、特別に作成された関数を呼び出すことは可能ですか?

Aug 18 2020

私はTelosysを使用しています(https://www.telosys.org)Pythonソースコードを生成すると、正常に動作します。しかし、特定の変換関数を呼び出すことで解決できる特定のニーズがあります。

特定の関数を作成し、それをTelosysテンプレート内で呼び出すことは可能ですか?

例:myFunction(“abc”)または$something.myFunction(“abc”)またはその他

必要に応じて、Java、Python、JavaScriptなどのさまざまな言語でこの関数を作成することができます。

回答

3 lgu Aug 19 2020 at 10:02

Telosysは拡張可能に設計されているため、独自の関数を作成してテンプレートで呼び出すことができます。TelosysはJavaで記述されているため、これらの関数をJavaで作成してから、「。vm」ファイルの「loader」オブジェクトを使用してクラスをロードし、このクラスで定義されているメソッドを呼び出す必要があります。

ステップバイステップでそれを行う方法は次のとおりです。

  1. 好みのIDEを使用して、特定のメソッドを定義するJavaクラスを作成します。このクラスは任意のパッケージ(「デフォルト/名前のないパッケージ」を含む)に含めることができ、クラスのインスタンスが必要ない場合は、メソッドを「静的」にすることができます。

  2. このクラスをコンパイルします(目的は、単純な「.class」ファイルまたは必要に応じて「.jar」ファイルを作成することです)

  3. クラス(またはjar)をテンプレートバンドルフォルダーに配置します。

  • .class」ファイルがある場合は、「classes」フォルダに入れてください
  • .jar」ファイルがある場合は、「lib」フォルダに入れます

例:

TelosysTools/templates/my-bundle/classes/MyClass.class
TelosysTools/templates/my-bundle/lib/my-lib.jar
  1. テンプレートファイル( ".vm")で、 " $ loader "オブジェクトを使用してJavaクラスをロードし、そのメソッドのいずれかを呼び出します。ここで "$ loader"リファレンスを参照してください。http://www.telosys.org/templates-doc/objects/loader.html

すべてのメソッドが「静的」である場合、インスタンスは必要ないため、「$ loader.loadClass()」を使用するだけです。例:

## load the class and keep it in a new “$Math” object (no instance created)
#set( $Math = $loader.loadClass("java.lang.Math")
## use the static methods of this class
$Math.random()

メソッドが「静的」ではなく、インスタンスが必要な場合は、「$ loader.newInstance()」を使用します。例:

## create an instance of StringBuilder and put it in the context with #set
#set( $strBuilder = $loader.newInstance('java.lang.StringBuilder') )
## use the instance to call a method
$strBuilder.append('aa') ## create new instance of a specific class : MyTool.class #set( $tool = $loader.newInstance('MyTool') ) ## use the instance to call a method $tool.myFunction()

つまり、Java-JREが提供する任意のクラス(「Math」、「StringBuilder」など)を使用でき、「。jar」ファイルを追加して既存のライブラリを再利用できます(必要な依存関係を追加することを忘れないでください。 jarファイルはスタンドアロンではありません)または単一の「.class」ファイルを追加するだけです。