刚才给在做的项目里加了些便捷功能,把做法记下来。
我们在Java应用里嵌入了Groovy脚本。为了方便,业务里经常用的一些类可以默认import进来,让大家少写点重复代码。幸好,这种功能用Groovy来做毫不费力。
import groovy.lang.GroovyClassLoader;
import java.security.CodeSource;
import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.ModuleNode;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilationUnit;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.Phases;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.control.CompilationUnit.SourceUnitOperation;
public class CustomGroovyClassLoader extends GroovyClassLoader {
private final String[] DEFAULT_IMPORT_CLASSES = {
"rednaxelafx.sample.Foo",
"rednaxelafx.sample.Bar"
};
/**
* Validate classes.
*
* Because the specified default import classes might not be present in
* the during runtime, they have to be validated first, otherwise Groovy
* won't compile the code.
*
* @param className the name of the class to validate
* @return true iff the class exists and is valid
*/
private boolean isClassValid(String className) {
try {
loadClass(className, false);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
private static String getClassSimpleName(final String className) {
return className.substring(className.lastIndexOf('.') + 1);
}
private static boolean alreadyImported(final String alias, final ModuleNode ast) {
return ast.getImport(alias) != null;
}
/**
* add default imports
*/
@Override
protected CompilationUnit createCompilationUnit(
CompilerConfiguration config, CodeSource source) {
CompilationUnit compUnit = super.createCompilationUnit(config, source);
compUnit.addPhaseOperation(new SourceUnitOperation() {
public void call(SourceUnit source) throws CompilationFailedException {
ModuleNode ast = source.getAST();
for (String className : DEFAULT_IMPORT_CLASSES) {
String simpleClassName = getClassSimpleName(className);
if (isClassValid(className) && !alreadyImported(simpleClassName, ast)) {
ast.addImport(simpleClassName, ClassHelper.make(className));
}
}
}
}, Phases.CONVERSION);
return compUnit;
}
}
直接用ast.addImport()的话,这些添加的“默认”import实际上是被append到原本的import列表的后面了。Groovy里后import的比先import的要更优先,所以这种默认import可能会带来干扰。要注意。
分享到:
相关推荐
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
groovy脚本实现对数据库的增删改查,groovy脚本不需要编译,十分实用
Android Studio中的Gradle开发脚本语言Groovy,Groovy入门,以及精通
干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc
项目从es2升级到es6,groovy脚本也要相应的转换为painless脚本,转换过程中遇到了很多坑,特此总结成文档,供大家一起交流学习。
groovy脚本语言bin groovy-binary-1.6.5.zip
执行测试开发过程中的groovy脚本,无须安装,解压即可使用,直接运行bin目录下的groovyConsole.bat即可。
脚本解析工具,可使用Groovy或Xquery解析JSON报文或XML报文
java嵌入groovy所需jar 2.3.7最新版
动态加载指定目录下的groovy脚本,并将其注册为groovy bean,放置于ApplicationContext容器中,并使用命名空间进行分类区分(一个namespace对应于一个ApplicationContext)。同时能够动态感知到groovy脚本的新增、修改...
CPI的Groovy脚本示例Groovy脚本是SAP Cloud Platform Integration(CPI)不可或缺的重要功能该存储库的目标是: 实施新脚本时提供模板轻松找到与CPI主题相关的Groovy函数减少常见任务的搜索引擎时间为初学者提供教育...
对javax.script包进行讲解,实现支持java动态嵌入执行groovy代码片段
java 动态脚本语言 精通 Groovy
SoapUI插件实现import groovy功能
脚本通过上下文applicationcontext获取被测试应用bean,从而可以进行接口内容获取等操作。目前该方式主要运用到性能平台脚本搭建、代码深度测试、接口测试、白盒测试等多方面。...支持Java、groovy脚本。
SoapUI插件实现import groovy功能 V2 http://blog.csdn.net/wwwqjpcom/article/details/51592896 更新的地方主要是不再在java.io.tmpdir目录下产生临时groovy文件
IDEA连接数据库生成带注解的实体类方法与定制Groovy生成脚本适用于springboot jpa中IDEA连接数据库生成带注解的实体类方法与定制Groovy生成脚本适用于springboot jpa中
动态加载指定目录下的groovy脚本,并将其注册为groovy bean,放置于ApplicationContext容器中,并使用命名空间进行分类区分(一个namespace对应于一个ApplicationContext)。同时能够动态感知到groovy脚本的新增、修改...
gstorm, 在groovy脚本中,一个用于数据库和CSV文件的简单 ORM GStorm - Groovy单个表 ORMGStorm是一个轻量级的持久性 helper,允许你在没有任何样板代码的情况下持久化数据。 它也可以充当CSV文件的和 ORM 。示例...
1)SAP HCI上打印IFLOW的日志。2)能看到HTTP详细信息,包括header,body,property等信息。