groovy代码动态加载运行实战
Groovy是什么: 它是新一代java,也是运行在JVM中,有自己更简练的语法,更像脚本语言,但是其也支持JAVA语法 1. 插件安装 打开idea, preferences -> Plugins -> 搜索Groovy,找到然后点击安装;如果没有搜到,那么添加repositories:http://dist.codehaus.org/groovy/distributions/update/ 2. 创建groovy项目 2.1 New -> Project -> Java Project 创建一个java项目 2.2 New -> Groovy Class? 创建groovy类,后缀为.groovy import java.text.SimpleDateFormat class GrvyCalculator { //groovy语法 def discount(a,b){ def c = a * b } //java语法 int add(int a,int b){ return a + b; } //java语法 String add(Map<Integer,String> map){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dateValue = sdf.parse("2017-12-08 08:00:00"); String var1 = map.get(0); String var2 = map.get(1); String var3 = map.get(2); StringBuilder sb = new StringBuilder(); return sb.append(var1).append("_").append(var2).append("_").append(var3).append("_").append(dateValue.format("yyyy-MM-dd HH:mm:ss")); } } 2.3 添加maven依赖 <dependency> <groupId>org.codehaus.gmaven.runtime</groupId> <artifactId>gmaven-runtime-1.8</artifactId> <version>1.4</version> <exclusions> <exclusion> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.8.7</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> 3. 实例化groovy类,并调用方法,新建java测试类 方式一: new一个groovy对象 public class GroovyTest { public static void main(String[] args){ Map<Integer,String> map = Maps.newHashMap(); map.put(0,"a"); map.put(1,"b"); map.put(2,"c"); Calculator calculator = new Calculator(); System.out.println("discount=" + calculator.discount(10,0.8)); System.out.println("add=" + calculator.add(1,2)); System.out.println("addStr=" + calculator.addStr(map)); } } 结果: discount=8.0 ? 方式二:用GroovyClassLoader动态编译Groovy类并实例化 public static void main(String[] args){ Map<Integer,"c"); ClassLoader cl = new CalculatorTest().getClass().getClassLoader(); GroovyClassLoader grvyCl = new GroovyClassLoader(cl); //将上面新建的Calculaotr.groovy类的代码放到grvyCalculatorFile的本地文件中 String grvyClassConcent = FileHelper.readFileContent("/Users/jimmy.wj/Documents/work/grvyCalculatorFile"); Class groovyClass = grvyCl.parseClass(grvyClassConcent); try { GroovyObject grvyObj = (GroovyObject) groovyClass.newInstance(); System.out.println("addStr=" + grvyObj.invokeMethod("addStr",map)); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } 结果: invokeMethod方法只有两个参数,第一个参数是方法名,第二个参数是方法的入参,类型是Object;其他两个方法因为有多个入参,这里不适用。 addStr=a_b_c 4.?用GroovyClassLoader动态编译Groovy代码片段 groovy方法可以单独存在,不一定要写在class中,比如我在本地文件grvyPartFile中仅把addStr方法的代码放进去,用上述的方法二,一样可以实例化groovy对象(应该是个匿名类) public static void main(String[] args){ Map<Integer,"c"); ClassLoader cl = new CalculatorTest().getClass().getClassLoader(); GroovyClassLoader grvyCl = new GroovyClassLoader(cl); //将上面新建的Calculaotr.groovy类的代码放到grvyPartFile的本地文件中 String grvyClassConcent = FileHelper.readFileContent("/Users/jimmy.wj/Documents/work/grvyPartFile"); Class groovyClass = grvyCl.parseClass(grvyClassConcent); try { GroovyObject grvyObj = (GroovyObject) groovyClass.newInstance(); System.out.println("addStr=" + grvyObj.invokeMethod("addStr",map)); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }结果: addStr=a_b_c 推荐groovy的入门文章,基本语法整理的不错 http://blog.csdn.net/kmyhy/article/details/4200563 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |