在Telosys模板中是否可以调用专门创建的函数?

问题描述

我使用Telosys(https://www.telosys.org)生成Python源代码,并且工作正常。但是我有一个特定的需求,可以通过调用特定的转换函数来解决。

是否可以创建一个特定的函数并在Telosys模板中调用它?

例如:myFunction(“abc”)$something.myFunction(“abc”)或其他任何内容

如有必要,我可以用Java,Python或JavaScript等不同语言创建此功能。

解决方法

Telosys被设计为可扩展的,因此,是的,您可以创建自己的函数并在模板中调用它们。 由于Telosys是用Java编写的,因此您必须使用Java创建这些函数,然后使用“ .vm”文件中的“ loader ”对象加​​载您的类并调用该类中定义的方法。

这是逐步进行操作的方法:

  1. 使用首选的IDE创建一个Java类,以定义您的特定方法。此类可以位于任何程序包中(包括“默认/未命名程序包”),如果不需要该类的实例,则方法可以为“静态”。

  2. 编译此类(目标是生成一个简单的“ .class ”文件,或者根据需要生成一个“ .jar ”文件)

  3. 将类(或罐子)放入模板包文件夹中:

  • 如果您有一个“ .class ”文件,请将其放在“ ”文件夹中
  • 如果您有一个“ .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”文件。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...