groovy简介
所属分类 groovy
浏览量 2021
Groovy是一门基于JVM的动态语言 动态编译语言
java 里使用 groovy 的三种方式
GroovyShell
GroovyClassLoader
GroovyScriptEngine
GroovyClassLoader 动态加载脚本并执行 定制的类装载器
String expression = "import dyyx.Utils; double x = Utils.add(a,b) ; y = (x + c*1.5) /3 ; return y";
GroovyClassLoader loader = null;
loader = new GroovyClassLoader();
Class groovyClass = loader.parseClass(expression);
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
groovyObject.setProperty("a", 1);
groovyObject.setProperty("b", 2);
groovyObject.setProperty("c", 3);
result = groovyObject.invokeMethod("run", new Object[]{});
System.out.println(result);
如果Groovy脚本文件里只有执行代码,没有定义任何类(class),则编译器会生成一个Script的子类,
脚本的代码会包含在一个名为run的方法中,同时还会生成一个main方法,作为整个脚本的入口。
GroovyShell
Binding context = new Binding();
context.setProperty("a", 1);
context.setProperty("b", 2);
context.setProperty("c", 3);
GroovyShell shell = new GroovyShell(context);
Object result = null;
result = shell.evaluate(expression);
System.out.println(result);
GroovyScriptEngine
从指定的位置(文件系统,URL,数据库,等等)加载Groovy脚本
需要注意的问题
GroovyShell parse evaluate 方法 会动态生成类 , 导致 方法区 占用大量空间
perm 或 元数据区 占满 导致 fullgc
每执行一次脚本,都会生成一个脚本对应的class对象
可以缓存 GroovyClassLoader 生成的类对象 ,
脚本md5作为 key
// groovyClass 可以缓存 脚本md5作为 key
Class groovyClass = loader.parseClass(expression);
// groovyObject 不能缓存
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
groovyObject.setProperty("a", 1);
groovyObject.setProperty("b", 2);
groovyObject.setProperty("c", 3);
result = groovyObject.invokeMethod("run", new Object[]{});
System.out.println(result);
每个 script 都 new 一个 GroovyClassLoader 来装载
对于 parseClass 后生成的 Class 对象进行cache,key 为 脚本的md5
Groovy脚本 执行 多次后都会被JVM编译为 native 优化,会占据一些 CodeCache 空间
CodeCache 用满后,JVM Compiler 会被禁用,性能下降
如果Groovy脚本文件里只有执行代码,没有定义任何类(class),
编译器会生成一个Script的子类,类名和脚本文件的文件名一样,
脚本的代码会被包含在一个名为run的方法中,同时还会生成一个main方法,作为整个脚本的入口
如果Groovy脚本文件仅含有一个类,而这个类的名字又和脚本文件的名字一致,
生成与所定义的类一致的class文件
如果Groovy脚本文件含有多个类,为每个类生成一个对应的class文件
如果想直接执行这个脚本,脚本里的第一个类必须有一个static的main方法
groovy 例子代码
https://gitee.com/dyyx/mveldemo/blob/master/src/main/java/dyyx/GroovyDemo.java
上一篇
下一篇
linux configure --prefix 参数的作用
java日志打印建议
groovy与java的一些区别
groovy与mvel比较
常用硬件性能参数
System.getenv 与 System.getProperty 的区别