由于Groovy最终会编译成符合Java类的字节码,为了体验Groovy的一些比较Cool的功能,我们不妨也在Java中用点Groovy,下面的例子我们用一个简单的权限控制来演示:
class AuthTreeConfig {
static def AUTH_TREE = """
<auths>
<auth id="1" text="客户管理1" index="0" leaf="false" expanded="false" act="CAREREQANALYZER,PROVINCEADMIN">
<auth id="11" text="客户管理11" index="0" leaf="false" expanded="false" act="CAREREQANALYZER,PROVINCEADMIN">
<auth id="111" text="客户管理111" index="1" leaf="true" expanded="false" act="CAREREQANALYZER,PROVINCEADMIN">
</auth>
</auth>
<auth id="12" text="客户管理12" index="2" leaf="true" expanded="false" act="CAREREQANALYZER,PROVINCEADMIN">
</auth>
</auth>
<auth id="2" text="客户管理2" index="2" leaf="true" expanded="false" act="DISTRICTADMIN">
</auth>
</auths>
""";
}
上面的代码是一个权限树的配置文件,因为Groovy的动态编译,所以他即是Groovy源程序由是配置文件。
import groovy.xml.DOMBuilder
import groovy.xml.dom.DOMCategory
import cn.com.xinli.ccp.core.TreeNode
import static cn.com.xinli.ccp.groovy.AuthTreeConfig.AUTH_TREE as AUTH_TREE
class AuthReader{
def empty = []
static TreeNode[] getAuthTreeById(String id){
def temp = []
def reader = new StringReader(AUTH_TREE)
def doc = DOMBuilder.parse(reader)
def auths = doc.documentElement
use (DOMCategory) {
def authList = auths.'auth'.'**'
4 == authList?.size()
def root = authList.find{it.'@id' == id}
assert "客户管理1" == root.'@text'
def children = root.'*'
1 == children.size()
children.each(){
def tn = new TreeNode(
Long.parseLong(it.'@id'),
Long.parseLong(it.'@index'),
it.'@text',
Boolean.parseBoolean(it.'@leaf'),
Boolean.parseBoolean(it.'@expanded'),
it.'@atc'
)
temp.add(tn)
}
}
return temp
}
}
这段代码我们利用GPath来遍历和读取配置文件,并构造成树节点,这个类中提供的静态方法将会被我们的Java程序直接调用。
public class TreeNode {
private Long id;
private String text;
private boolean expanded;
private boolean leaf;
private String act;
private Long index;
//getters and setters
}
调用代码可能像这样:
//...
private TreeNode[] getChildTreeNode(String id){
return AuthReader.getAuthTreeById(id);
}
//...
注意问题:
在实际开发的过程中,发现我们的Groovy生成的class文件放在WEB-INF/classes下面程序是找不到的,必须手动指定
Groovy生成类路径,并将它引入Java工程,而这个在部署到Web Server下面是就找不到了。所以这时候我们又需要将生成的类文件拷贝到WEB-INF/classes下面。而且我们要注意防止乱码。
当然我们还可以用Groovy类加载器来执行Groovy脚本,代码像这样:
import java.io.File;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
/**
* 动态加载Groovy脚本,调用它的方法
* @author samueli
*
*/
public class DynamicGroovy {
private GroovyObject groovyObject;
public Object getProperty(String name) {
return groovyObject.getProperty(name);
}
@SuppressWarnings("unchecked")
public Object invokeScriptMethod(String scriptName, String methodName,
Object[] args) {
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
try {
Class groovyClass = loader.parseClass(new File(scriptName));
groovyObject = (GroovyObject) groovyClass.newInstance();
return groovyObject.invokeMethod(methodName, args);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws Exception {
DynamicGroovy dynamicGroovy = new DynamicGroovy();
Object[] params = { "1" };
Object result = dynamicGroovy.invokeScriptMethod(
"src/com/samueli/groovy/AuthReader.groovy",
"getAuthTreeById",
params);
System.out.println(result);
System.out.println(dynamicGroovy.getProperty("empty"));
}
}
分享到:
相关推荐
在Java开发中,Groovy是一种强大的、动态类型的脚本语言,它可以无缝地与Java代码集成,为开发者提供了更简洁、灵活的语法。本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。...
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的...
Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...
- **Spring Batch/Task**:Spring框架的Batch和Task模块也可以用于调度Groovy任务,尤其是在Spring Boot应用中。 5. **动态代码执行**: - Groovy的动态特性使得它非常适合执行动态生成的代码,比如根据某些条件...
SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
#### 知识点一:Java与Groovy的关系 - **定义**:Groovy是一种面向对象的编程语言,它直接运行在Java平台上,并且能够与现有的Java代码无缝集成。 - **特点**: - **语法简洁**:Groovy提供了更为简洁、动态的语法...
Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx
Java调用Groovy是一种常见的技术,特别是在开发过程中需要动态脚本支持时。Groovy是一种基于JVM(Java Virtual Machine)的、动态类型的编程语言,它与Java有着良好的互操作性,能够无缝集成到Java项目中。这篇博客...
Making Java Groovy Kenneth A. Kousen 1.Easier Java 2.Closures, builders, and metaprogramming 3.Gradle for builds, Spock for testing 4.Groovy frameworks like Grails and Griffon 源码
Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...
Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合...
Groovy不仅能在Java虚拟机(JVM)上运行,还能与现有的Java代码无缝集成,这使得Groovy成为Java生态系统中的一个强大补充。 ### 本书的核心知识点 #### 1. Groovy语言的基础语法 书中详细介绍了Groovy的基础语法,...
Making Java Groovy--Kenneth.A.Kousen. Java Groovy 很不错的学习资料
本文将深入探讨如何在Java中调用三种流行的脚本语言:Jython、JRuby和Groovy。 ### Jython Jython是Python的一个Java实现,它允许Java开发者利用Python的强大语法和丰富的库。要使用Jython,首先需要在项目中引入...
本书由Scott Davis编写,作为Pragmatic Bookshelf出版社的一员,他在书中深入浅出地介绍了如何将Groovy集成到日常的Java开发工作中,使复杂的问题变得简单,让繁琐的任务变得流畅。 ### Groovy脚本:Java开发者的...
### 通过与Java的比较,迅速掌握Groovy #### 一、Groovy与Java的关键差异 **1. 变量定义** - **Groovy**:Groovy支持使用`def`关键字来定义未指定类型的变量,这类似于JavaScript中的`var`。例如: ```groovy ...
这意味着Groovy可以无缝地与现有的Java项目集成,成为Java开发中的强大辅助工具。 总结起来,"groovy-2.3.6-installer"是一个针对Windows用户的Groovy安装程序,提供了便捷的安装途径,帮助开发者快速搭建Groovy...
1、eclipse安装groovy的插件。 2、创建java project。 3、把groovy-all-2.1.9.jar,加入...4、编写hello.groovy脚本文件,并在java代码中调用脚本文件 http://blog.csdn.net/bolg_hero/article/details/19077981