JavaでGroovyスクリプトを使用する

2602 ワード

一、Groovyの紹介
GroovyはJVM(Java仮想マシン)ベースの敏捷な開発言語で、Python、Ruby、Smalltalkの多くの強力な特性を結合し、GroovyコードはJavaコードとよく結合し、既存のコードを拡張するためにも使用できます.JVM上で実行される機能のため、Groovyは他のJava言語で作成されたライブラリを使用できます.
二、JavaにおけるGroovyの応用シーン
GroovyはJavaクラスライブラリと互換性があるため、ユーザーはGroovyスクリプトを作成し、カスタムタスクを実行し、Groovyスクリプトコンポーネントを使用してこのスクリプトを実行することができます.
三、使用例
3.1 mavenにgroovyを導入するために必要な依存
	
	
	    org.codehaus.groovy
	    groovy-all
	    2.4.15
	

3.2 groovyスクリプトを実行するツールクラス
package org.lin.hello.groovy;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;

import org.codehaus.groovy.runtime.InvokerHelper;

import groovy.lang.Binding;
import groovy.lang.GroovyClassLoader;
import groovy.lang.Script;

/**
 * Groovy      
* groovy * @author ljf * */ public class GroovyUtil { /** */ private static final Map context = new HashMap(); private static GroovyClassLoader gcl = new GroovyClassLoader(); /** groovy */ private static Map> classPool = new ConcurrentHashMap>(); /** * */ public static void bind(String key, Object value) { context.put(key, value); } public static void unBind(String key) { context.remove(key); } /** * groovy */ public static void runScript(String scriptStr) { Binding binding = bindVariables(); String className = genClassName(scriptStr); Class> clazz = classPool.get(className); if (clazz == null) { clazz = gcl.parseClass(scriptStr, className); classPool.put(className, clazz); } Script script = InvokerHelper.createScript(clazz, binding); script.run(); } private static String genClassName(String scriptStr) { return String.valueOf(scriptStr.hashCode()); } private static Binding bindVariables() { Binding binding = new Binding(); for (Entry entry : context.entrySet()) { binding.setVariable(entry.getKey(), entry.getValue()); } return binding; } public static void main(String[] args) { GroovyUtil.bind("name", "jack"); GroovyUtil.bind("company", "otaku"); GroovyUtil.runScript("System.out.println(\"My name is \" + name + \"," + " and my company is \" + company);"); } }