首页  

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 的区别