• 四、动态函数
    • 4. 动态函数
    • 3.1 动态类方法说明
      • 3.1.1 构造函数
      • 3.1.2 构造函数
      • 3.1.3 包名属性
      • 3.1.4 命名的名称属性
      • 3.1.5 是否支持代码中的 import
      • 3.1.6 用户代码属性
      • 3.1.7 得到实际编译的类名称
      • 3.1.8 获得编译后的 Class 对象
      • 3.1.9 增加/删除一个调用参数
      • 3.1.10 增加/删除一个预置导入类
      • 3.1.11 导入动态函数的管理
      • 3.1.12 编译用户代码
      • 3.1.13 执行动态函数
    • 3.2 举个例子

    四、动态函数

    4. 动态函数

    类: org.voovan.tools.compiler.function.DynamicFunction

    3.1 动态类方法说明

    3.1.1 构造函数

    1. public DynamicFunction(String name, String code)
    • name: 命名的名称。
    • code: 用户代码。

    3.1.2 构造函数

    1. public DynamicFunction(File file, String charset)
    • 默认使用文件名作为命名
    • file: 脚本文件路径。
    • charset: 脚本文件编码。

    3.1.3 包名属性

    1. public String getPackageName()
    2. public void setPackageName(String packageName)
    • 设置/获取动态函数编译的类的包名,默认:org.voovan.tools.compiler.temporary
    • name: 包名。

    3.1.4 命名的名称属性

    1. public String getName()
    2. public void setName(String name)
    • name: 命名的名称。

    3.1.5 是否支持代码中的 import

    1. public boolean isEnableImportInCode()
    2. public void enableImportInCode(boolean enableImportInCode)
    • enableImportInCode: true:支持代码中的 import, false: 不支持代码中的 import。

    3.1.6 用户代码属性

    1. public String getCode()
    2. public void setCode(String code)
    • 用户代码
    • code: 用户代码。

    3.1.7 得到实际编译的类名称

    1. public String getClassName()
    • 返回值: 实际编译的类名称。

    3.1.8 获得编译后的 Class 对象

    1. public Class getClazz()
    • 返回值: 实际编译的类对象。

    3.1.9 增加/删除一个调用参数

    1. public void addPrepareArg(int argIndex, Class argClazz, String argName)
    2. public void removePrepareArg(int argIndex)
    • argIndex: 调用参数的索引。
    • argClazz: 调用参数的类。
    • argName: 调用参数的名称。

    3.1.10 增加/删除一个预置导入类

    1. public void addImport(Class clazz)
    2. public void removeImport(Class clazz)
    • clazz: 导入类对象。

    3.1.11 导入动态函数的管理

    1. public void addImportFunction(String name)
    2. public List<String> getImportFunctionx()
    3. public void clearImportFunctions()
    • name: 动态函数名称。

    3.1.12 编译用户代码

    1. public void compileCode()

    3.1.13 执行动态函数

    1. public <T> T call(Object... args)
    • args: 调用参数。
    • 返回值: 动态函数执行后的结果。

    3.2 举个例子

    1. {
    2. String code = "import java.util.ArrayList;\n\n" +
    3. "ArrayList list = new ArrayList();\n" +
    4. "System.out.println(temp1+ temp2); \n" +
    5. "SubFunCode();\n" +
    6. "return list;\n";
    7. DynamicFunction dynamicFunction = new DynamicFunction("TestCode",code); //字符串形式的脚本
    8. //增加默认导入
    9. dynamicFunction.addImport(ArrayList.class);
    10. //增加对其他动态函数的引用
    11. dynamicFunction.addImportFunction("SubFunCode");
    12. //启用脚本中的 import 导入
    13. dynamicFunction.enableImportInCode(true);
    14. //准备脚本的默认参数
    15. dynamicFunction.addPrepareArg(0, String.class, " temp1");
    16. dynamicFunction.addPrepareArg(1, String.class, " temp2");
    17. System.out.println("=============Args list=============");
    18. System.out.println("arg0 -> 0 String temp1 = hely ");
    19. System.out.println("arg1 -> 0 String temp2 = ho \n");
    20. System.out.println("============= result =============");
    21. for(int i=0;i<4;i++) {
    22. System.out.println("\r\n=============Run "+i+"=============");
    23. System.out.println("==>name:" +dynamicFunction.getName());
    24. System.out.println("==>classname:" +dynamicFunction.getClassName());
    25. long startTime = System.currentTimeMillis();
    26. //运行脚本
    27. List list = dynamicFunction.call("hely ", "ho");
    28. System.out.println("==>RunTime: "+(System.currentTimeMillis()-startTime )+"\r\n==>Result: " + list);
    29. TEnv.sleep( 1000 );
    30. }
    31. }