三、动态类

3. 动态类

类: org.voovan.tools.compiler.clazz.DynamicClass

3.1 动态类方法说明

3.1.1 构造函数

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

3.1.2 构造函数

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

3.1.3 命名的名称属性

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

3.1.4 用户代码属性

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

3.1.5 得到实际编译的类名称

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

3.1.6 获得编译后的 Class 对象

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

3.1.7 编译用户代码

  1. public void compileCode()

3.2 举个例子

  1. code = "package org.hocate.test;\r\n\r\n"
  2. + "import org.voovan.tools.TString;\r\n"
  3. + "public class TestSay {\r\n"
  4. + "\t public String say(){\r\n"
  5. + "\t\t System.out.println(\"helloword\");\r\n"
  6. + "\t\t return TString.removePrefix(\"finished\"); \r\n"
  7. + "\t }\r\n"
  8. + "}\r\n";
  9. DynamicClass dynamicClass = new DynamicClass("TestCode",code); // 文件形式的脚本
  10. for(int i=0;i<4;i++) {
  11. System.out.println("\r\n=============Run "+i+"=============");
  12. long startTime = System.currentTimeMillis();
  13. //运行脚本
  14. Class clazz = dynamicClass.getClazz();
  15. System.out.println("==>name:" +dynamicClass.getName());
  16. System.out.println("==>classname:" +dynamicClass.getClassName());
  17. Object testSay = DynamicCompilerManager.newInstance("TestSay",null);
  18. try {
  19. Object obj = TReflect.invokeMethod(testSay, "say");
  20. System.out.println("==>RunTime: " + (System.currentTimeMillis()-startTime )+"\r\n==>Result: " + obj);
  21. }catch (Exception e){
  22. Logger.error(e);
  23. }
  24. TEnv.sleep( 1000 );
  25. }