groovy java_在java中使用groovy怎么搞

bd40ccd2c23fd7e5e1bc7e1f354a0385.png

临摹微笑

一种基于Java虚拟机的动态语言,可以和java无缝集成,正是这个特性,很多时候把二者同时使用,把groovy作为java的有效补充。对于Java程序员来说,学习成本几乎为零。同时支持DSL和其他简介的语法(例如闭包),使代码便于阅读。可以用groovy的动态特性来做规则引擎,在DB中维护脚本,业务变化的时候让应用系统动态加载。如果引入groovy在java工程中?这个很简单,不需要做别的事情,仅仅把groovy的二方包加入到pom文件中即可。例如:org.codehaus.groovygroovy-all 1.8 . 3 java和groovy混合使用的方法有几种?1、 静态编译 ,在java工程中直接写groovy的文件,然后可以在groovy的文件中引用java工程的类,这种方式能够有效的利用groovy自身的语言特性,例如闭包;2、通过 groovyShell 类直接执行脚本,例如:package groovy_dsl.shell;import groovy.lang.Binding;import groovy.lang.GroovyShell;public class GroovyShellEx {public static void main(String[] args) {Binding bind = new Binding();bind.setVariable( "name" , "iamzhongyong" );bind.setVariable( "age" , "25" );GroovyShell shell = new GroovyShell(bind);Object obj = shell.evaluate( "str = name+age;return str" );System.out.println(obj);}}3、通过 groovyScriptEngine 执行文件或者脚本,例如:package groovy_dsl.script;import groovy.util.GroovyScriptEngine;public class ScriptEngine {public static void main(String[] args) throws Exception {GroovyScriptEngine engine = new GroovyScriptEngine( "" );Object obj = engine.run( "src/main/java/groovy_dsl/script/script_test.groovy" , "iamzhongyong" );System.out.println(obj);}}4、通过 GroovyClassLoader 来执行,例如:package groovy_dsl.classloader;import groovy.lang.GroovyClassLoader;import groovy.lang.GroovyObject;import java.io.File;import java.io.IOException;public class GroovyClassLoaderEx {public static void main(String[] args) throws Exception, IOException {GroovyClassLoader loader = new GroovyClassLoader();for ( int i= 0 ;i< 100 ;i++){Class> clazz = loader.parseClass( new File( "src/main/java/groovy_dsl/classloader/UserDO.groovy" ));GroovyObject clazzObj = (GroovyObject)clazz.newInstance();clazzObj.invokeMethod( "setName" , "iamzhongyong" );clazzObj.invokeMethod( "setSex" , "Boy" );clazzObj.invokeMethod( "setAge" , "26" );System.out.println(clazzObj.invokeMethod( "getAllInfo" , null ));}}}使用groovy尤其需要主要的问题?通过看groovy的创建类的地方,就能发现,每次执行的时候,都会新生成一个class文件,这样就会导致JVM的perm区持续增长,进而导致FullGCc问题,解决办法很简单,就是脚本文件变化了之后才去创建文件,之前从缓存中获取即可。groovy中的源码如下:return parseClass(text, "script" + System.currentTimeMillis() + Math.abs(text.hashCode()) + ".groovy" );这个是增加缓存的代码:GroovyClassLoader groovyClassLoader = new GroovyClassLoader(GroovyScriptExecute. class .getClassLoader());Class> groovyClass = null ;String classKey = String.valueOf(scriptClass.hashCode());//先从缓存里面去Class文件if (GroovyScriptClassCache.newInstance().containsKey(classKey)){groovyClass = GroovyScriptClassCache.newInstance().getClassByKey(classKey);} else {groovyClass = groovyClassLoader.parseClass(scriptClass);GroovyScriptClassCache.newInstance().putClass(classKey, groovyClass);}GroovyObject go = (GroovyObject)groovyClass.newInstance();下面这个是缓存的单例类,贴一下:public class GroovyScriptClassCache {private static final Map> GROOVY_SCRIPT_CLASS_CACHE = new HashMap>();private GroovyScriptClassCache(){}private static GroovyScriptClassCache instance = new GroovyScriptClassCache();public static GroovyScriptClassCache newInstance(){return instance;}public Class> getClassByKey(String key){return GROOVY_SCRIPT_CLASS_CACHE.get(key);}public void putClass(String key,Class> clazz){GROOVY_SCRIPT_CLASS_CACHE.put(key, clazz);}public boolean containsKey(String key){return GROOVY_SCRIPT_CLASS_CACHE.containsKey(key);}}为啥要每次new一个GroovyClassLoader,而不是所有的脚本持有一个?因为如果脚本重新加载了,这时候就会有新老两个class文件,如果通过一个classloader持有的话,这样在GC扫描的时候,会认为老的类还在存活,导致回收不掉,所以每次new一个就能解决这个问题了。注意CodeCache的设置大小对于大量使用Groovy的应用,尤其是Groovy脚本还会经常更新的应用,由于这些Groovy脚本在执行了很多次后都会被JVM编译为native进行优化,会占据一些CodeCache空间,而如果这样的脚本很多的话,可能会导致CodeCache被用满,而CodeCache一旦被用满,JVM的Compiler就会被禁用,那性能下降的就不是一点点了。Code Cache用满一方面是因为空间可能不够用,另一方面是Code Cache是不会回收的,所以会累积的越来越多(其实在不采用groovy这种动态更新/装载class的情况下的话,是不会太多的),所以解法一可以是增大code cache的size,可通过在启动参数上增加-XX:ReservedCodeCacheSize=256m(Oracle JVM Team那边也是推荐把code cache调大的),二是启用code cache的回收机制(关于Code Cache flushing的具体策略请参见此文),可通过在启动参数上增加:-XX:+UseCodeCacheFlushing来启用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动控制库_一个可以自动化控制鼠标键盘的库:PyAUtoGUI

PyAutoGUI 不知道你们有没有用过&#xff0c;它是一款用Python自动化控制键盘、鼠标的库。但凡是你不想手动重复操作的工作都可以用这个库来解决。如果&#xff0c;我想半夜时候定时给发个微信&#xff0c;或者每天自动刷页面等操作&#xff0c;它能完全模拟手动操作&#xff0…

Java使用自定义包

包的声明和使用非常简单&#xff0c;在了解基本语法之后&#xff0c;示例在 Java 程序中声明包&#xff0c;以及不同包之间类的使用。 1 创建一个名为 com.dao 的包。 2 向 com.dao 包中添加一个 Student 类&#xff0c;该类包含一个返回 String 类型数组的 GetAll() 方法。S…

python去掉一个最高分和最低分求平均数_excel去掉一个最高分和最低分求平均数 - 卡饭网...

怎么快速计算考试成绩的最高分、最低分、平均分&#xff1f;怎么快速计算考试成绩的最高分、最低分、平均分&#xff1f; 我们可以使用Excel工作表快速计算出学校考试成绩的最高分.最低分和平均分,不需要逐个计算和核查,下面就跟小编看一下操作方法.具体如下:1. 第一步,打开一个…

mysql 类似wm concat_oracle的wm_concat()和mysql的group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别...

前言标题几乎已经说的很清楚了&#xff0c;在oracle中&#xff0c;concat()函数和 “ || ” 这个的作用是一样的&#xff0c;是将不同列拼接在一起&#xff1b;那么wm_concat()是将同属于一个组的(group by)同一个字段拼接在一起变成一行。mysql是一样的&#xff0c;只不过mysq…

试图将驱动程序添加到存储区_基于容器的块存储使用

什么是块存储&#xff1f;分布式存储系统&#xff0c;为业务与数据在集群内漂移提供了自由保障&#xff0c;满足企业对于不受约束的系统环境要求。同时&#xff0c;平台仅保存迁移被改动的数据&#xff0c;而非整体增加数据量&#xff0c;实现增量备份。魔方云块存储的功能&…

C++类和对象的概念

C 是一门面向对象的编程语言&#xff0c;理解 C&#xff0c;首先要理解类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;这两个概念。 C 中的类&#xff08;Class&#xff09;可以看做C语言中结构体&#xff08;Struct&#xff09;的升级版。结构体是一种…

参数名称 java_java – 具有重要名称的WSDL中的参数名称

我正在使用JAXWS RI在Java中创建一个WebService.在自动部署应用程序WAR时创建WSDL文件.问题是我希望WSDL文件中的参数(每个操作接收到)具有重要的名称,但它们显示为arg0,arg1,arg2 …有没有办法定义这个参数的名称,不使用默认名称&#xff1f;我已经实施了以下内容&#xff1a;…

python列表生成时 if_Python列表生成式

最简单的列表生成式l [x for x in range(10)]print(l)# 相当于l []for x in range(10):l.append(x)print(l)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]使用运算式的列表生成式l [x * x for x in range(10)]print(l)# 相当于l []for x in range(10):l.a…

如何编译和运行C++程序?

C 和C语言类似&#xff0c;也要经过编译和链接后才能运行。那么C是如何运行的呢&#xff0c;C和C的运行步骤是一样的。我们需要留意的是C源文件的后缀&#xff0c;以及GCC 中的g命令。 下图是 C/C 代码生成可执行文件的过程&#xff1a; C源文件的后缀 C语言源文件的后缀非…

java 控制台五子棋_java控制台五子棋

package frank;import java.io.*;public class App{//棋盘private String[][] board;//棋盘大小private static int BOARD_SIZE 15;//初始化棋盘public void initBoard(){board new String[BOARD_SIZE][BOARD_SIZE];for(int i 0; i < BOARD_SIZE; i){for(int j 0; j<…

pythonista脚本合集_GitHub - xchenhao/You-are-Pythonista: 汇聚【Python应用】【Python实训】【Python技术分享】等等...

You-are-Pythonista汇聚【从零单排】【实战项目】【Python面试题】【大航海】【Python应用】【Python错题集】【技术沙龙】【内推渠道】等等【人人都是Pythonista】由公众号【Python专栏】推出&#xff0c;请认准唯一标识&#xff1a;请仔细阅读本文档&#xff0c;尤其是使用说…

python配色_python语言再次解决文章配色难题

配色的选择是在我们论文文章画图过程中经常面临的一个问题。常用的R或python语言都内置了默认的颜色系统&#xff0c;强大的默认设置可以满足我们的绘图需求。但当我们需要绘制更多的图形时&#xff0c;固定的配色就会显得重复&#xff0c;此时通过自定义颜色就可以丰富图形的表…

java hashcode返回值_Java HashMap返回值未根据我对equals和hashcode的理解进行确认

以下代码示例的输出是&#xff1a;{1–e e2&#xff0c;2–e1 e1}package com.sid.practice;import java.util.HashMap;import java.util.Map;public class InputOutputPractice{public InputOutputPractice(){}public static void main(String[] args){Employee e new Inpu…

C++输入输出

C语言中&#xff0c;我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在C语言中&#xff0c;C语言的这一套输入输出库我们仍然能使用&#xff0c;但是 C 又增加了一套新的、更容易使用的输入输出库。 简单的输入输出代码示例&#xff1a; #include<iostream>…

python中的pymysql_(转)Python中操作mysql的pymysql模块详解

原文&#xff1a;https://www.cnblogs.com/wt11/p/6141225.htmlhttps://shockerli.net/post/python3-pymysql/----Python 3 进阶 —— 使用 PyMySQL 操作 MySQL前言pymsql是Python中操作MySQL的模块&#xff0c;其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者…

堆排序java实例_堆排序(示例代码)

前言&#xff1a;网上有很多堆排序的案例&#xff0c;我只想写自己堆排序。一&#xff1a;堆结构即&#xff1a;一个父节点最多只能有两个子节点(可以没有)&#xff0c;如下图图1图2图3 图4二&#xff1a; 数组与堆结构转换假设已知堆数组 int[] a {9,7,6,4,5,1,3,2,} 则相…

C++变量位置

C 在C语言部分做了细节上的改进&#xff0c;变量的定义位置就是其中之一。 请看下面的代码&#xff1a; #include <stdio.h> int main(){int a;scanf("%d", &a);int b;scanf("%d", &b);int c a b;printf("%d\n", c);return 0;…

java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...

看到这个问题&#xff0c;真心觉得初学入门就用IDE真心不是一个好方法。IDE屏蔽了太多基础知识&#xff0c;比如Java是需要编译的&#xff0c;运行的是编译后的class文件。编译命令有编译参数&#xff0c;执行命令有执行命令的参数。还有环境变量&#xff0c;classpath等。由于…

python 生成图片_python生成带有表格的图片

因为工作中需要&#xff0c;需要生成一个带表格的图片例如&#xff1a;直接在html中写一个table标签&#xff0c;然后单独把表格部分保存成图片或者是直接将excel中的内容保存成一个图片刚开始的思路&#xff0c;是直接生成一个带有table标签的html文件&#xff0c;然后将这个文…

C++布尔类型

C语言中&#xff0c;关系运算和逻辑运算的结果有两种&#xff0c;真和假&#xff1a;0 表示假&#xff0c;非 0 表示真。例如&#xff1a; #include <stdio.h> int main(){int a, b, flag;scanf("%d %d", &a, &b);flag a > b; //flag保存关系运算…