java调用脚本语言笔记(jython,jruby,groovy)

2023-11-19

 有两种方法
1.java se 6以后实现了jsr 223规范
java代码:

[java]  view plain copy
  1. ScriptEngineManager factory = new ScriptEngineManager();  
  2. ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"  
  3. scriptEngine.eval(code);//执行一段脚本,code是js代码  


 很方便调用脚本

2.可以使用脚本语方本身提供的与java的集成手段

jython集成
使用jsr223:
前提下载jython的包,已实现jsr223
(建议在官网上下载,在安装目录下有jython.jar,http://repo2.maven.org/maven2/org/python/jython/2.5.0/ 这里也有,但是这个包里没有jsr223的实现,看包下存不存在org.python.jsr223)

[java]  view plain copy
  1. ScriptEngineManager factory = new ScriptEngineManager();  
  2. ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"  
  3. scriptEngine.eval(code);  


使用PythonInterpreter,可以调用exec(String code)方法:

[java]  view plain copy
  1. PythonInterpreter interpreter = new PythonInterpreter();  
  2. interpreter.exec(code);  

访问数据库
使用jdbc:

[python]  view plain copy
  1. from oracle.jdbc.driver import OracleDriver  
  2. from java.sql import DriverManager  
  3.   
  4. username = 'hr'  
  5. password = '123456'  
  6. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
  7. driver = OracleDriver()  
  8. DriverManager.registerDriver(driver)  
  9. conn = DriverManager.getConnection(url, username, password)  
  10. stmt = conn.createStatement()  
  11. sql = "select salary from EMPLOYEES t where t.salary<2300"  
  12. rs = stmt.executeQuery(sql)  
  13. while (rs.next()):  
  14.  print rs.getInt('salary')  
  15. rs.close()  
  16. stmt.close()  


 结果:
2200
2100
2200

使用zxJDBC :

[python]  view plain copy
  1. from com.ziclix.python.sql import zxJDBC  
  2.   
  3. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
  4. username = 'hr'  
  5. password = '123456'  
  6. driverName = 'oracle.jdbc.driver.OracleDriver'  
  7. mysqlConn = zxJDBC.connect(url,username, password,driverName)  
  8. cursor = mysqlConn.cursor()       
  9. cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");  
  10. #print cursor.fetchone()  
  11. list = cursor.fetchall()  
  12. for record in list:  
  13.     print "name:"+record[0]  
  14. #print cursor.description[0]  
  15. #print cursor.description[1]  


 结果:
name:麦克
name:Olson
name:Philtanker

从数据库中查出的中文内容正常的。
而在代码里面的中文全部是乱码或抛异常,未解决。

与jruby集成
使用jsr223:Java代码

[java]  view plain copy
  1. ScriptEngineManager factory = new ScriptEngineManager();  
  2. ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"  
  3. scriptEngine.eval(code);  

 访问数据库

Ruby代码

[ruby]  view plain copy
  1. require 'java'  
  2.   
  3. module JavaLang  
  4.   include_package "java.lang"  
  5. end  
  6.   
  7. module JavaSql  
  8.   include_package 'java.sql'  
  9. end  
  10.   
  11. begin  
  12.  username = 'hr'  
  13.  password = '123456'  
  14.  url = 'jdbc:oracle:thin:@localhost:1521:XE'  
  15.  driverName = 'oracle.jdbc.driver.OracleDriver'  
  16.  JavaLang::Class.forName(driverName).newInstance  
  17.  conn = JavaSql::DriverManager.getConnection(url, username, password)  
  18.  stmt = conn.createStatement  
  19.  sql = "select last_name from EMPLOYEES t where t.salary<2300"  
  20.  rs = stmt.executeQuery(sql)  
  21.  while (rs.nextdo  
  22.   puts "名字:"+rs.getString("last_name")  
  23.  end  
  24.  rs.close  
  25.  stmt.close  
  26.  conn.close()  
  27. rescue JavaLang::ClassNotFoundException  
  28.  puts "ClassNotFoundException"  
  29. rescue JavaSql::SQLException  
  30.  puts "SQLException"  
  31. end  


 

 结果:
名字:楹﹀厠
名字:Olson
名字:Philtanker

 

从数据库中查出的中文内容为乱码的。
而在代码里面的中文正常。

 

与groovy集成
使用jsr223:

Java代码

[java]  view plain copy
  1. ScriptEngineManager factory = new ScriptEngineManager();  
  2. ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"  
  3. scriptEngine.eval(code);  


 使用GroovyShell:

Java代码

[java]  view plain copy
  1. GroovyShell shell = new GroovyShell();  
  2. Script script = shell.parse(code);  
  3. Object result = script.run();  


访问数据库

Groovy代码


 

[plain]  view plain copy
  1. import groovy.sql.Sql  
  2.   
  3. def username = 'hr'  
  4. def password = '123456'  
  5. def url = 'jdbc:oracle:thin:@localhost:1521:XE'  
  6. def driverName = 'oracle.jdbc.driver.OracleDriver'  
  7. def sql = Sql.newInstance(url, username, password, driverName)  
  8.   
  9. sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {  
  10.  println "名字:${it.last_name}"  
  11. }  

结果:
名字:麦克
名字:Olson
名字:Philtanker

 

在使用groovy过程中碰到了一个异常
Exception in thread "main" java.lang.VerifyError: (class: groovy/runtime/metaclass/java/util/ArrayListMetaClass, method: super$2$invokeMethod signature: (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;ZZ)Ljava/lang/Object;) Illegal use of nonvirtual function call
这个异常解决花了很长时间
是因为在原来项目中存在json-lib-2.1.jar(有可能名称为json-lib-2.1-jdk15.jar),这个包是用来处理json的,与groovy1.7.5存在冲突,更新为json-lib-2.3.jar即可
(json-lib里有一些groovy运行时处理的内容)

 

转自:http://yinxvxv.iteye.com/blog/811328  上面还有包 很不错

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java调用脚本语言笔记(jython,jruby,groovy) 的相关文章

随机推荐

  • 一步真实解决TypeError: unlink() got an unexpected keyword argument ‘missing_ok‘

    在谷歌服务器colab上跑yolo代码 训练自己的yolov5模型 遇到这个错误 可把我整不会了 已经做好了数据集 建立了新的data下的yaml和model下的yaml文件 然后使用代码 python train py 运行train p
  • 新仙魔九界研发及设计分析

    玩法本质属于捕鱼RPG玩法 美术风格属于国风 非常有特色 目前整体的玩法 性能优化和体验各方面都做的不错 从第三方数据平台获知该游戏目前月流水在600万 且有未来还有巨大的增长空间 这也不是波克城市第一次做出尝试 早在2015年就尝试过一个
  • druid 解析select查询sql获取表名,字段名,where条件

    解析select sql生成QueryModelInfo param dbTypeName mysql oracle param selectSql return public static QueryModelInfo parse Str
  • Vue将页面中Echarts动态图导出Gif动图

    Vue将页面中Echarts动态图导出Gif动图 首先 准备工作需要三个依赖的js 第一个js采用npm进行安装 npm install html2canvas 第二个js采用下载放入项目中进行使用 下载链接 https pan baidu
  • $refs用法

    refs获取dom元素 今天我们主要说一下几点 1 vue 获取普通元素 基础 2 vue 获取列表 基础 一 vue获取dom节点 普通元素 我们之前获取页面上的dom元素 很容易 比如原生js的 document getElements
  • Angular实现发送请求下载文件

    Angular实现下载文件到本地 第一步 获取下载地址 获取下载地址 download let param 参数 json形式 this download param subscribe res any gt if res success
  • 【无标题】AttributeError: ‘TransposedFont‘ object has no attribute ‘getbbox‘

    Python 运行 Wordcloud的时候出现了这个错误 from wordcloud import WordCloud from PIL import Image import matplotlib pyplot as plt topi
  • 3D游戏编程与设计作业——血条预制

    一 作业要求 血条 Health Bar 的预制设计 具体要求如下 分别使用 IMGUI 和 UGUI 实现 使用 UGUI 血条是游戏对象的一个子元素 任何时候需要面对主摄像机 分析两种实现的优缺点 给出预制的使用方法 二 实现效果 血条
  • ROS自学实践(10):ROS节点同时订阅多个话题并进行消息时间同步

    一 前言 在进行SLAM建图或自动驾驶系统设计的过程中 往往涉及到多种传感器进行环境感知和信息采集 这就不仅需要一个节点接收多个传感器数据 还要求传感器数据的时间戳同步 这样才能实现环境数据的实时感知和处理 本文基于ROS操作系统 从C 和
  • Android 5.x 权限问题解决方法

    0 关于selinux的基础知识 可以参见http www cnblogs com shell812 p 6379321 html TE语言规则 参见http www cnblogs com shell812 p 6379370 html
  • npx报错“Path must be a string. Received undefined”in windows解决方法

    在使用Windows上使用较老版本的nodejs 如何我使用的v8 9其自带的npx的版本为9 7 在Windows上使用会存在 Path must be a string Received undefined 的错误 通过 GitHub
  • QT程序运行时依赖设置

    本文主要解决Qt程序运行时容易遇到的两个问题 找不到相关的Qt6Core dll Qt6Widgets dll等库 这种情况下 把相关DLL所在目录添加到系统的环境变量 PATH 中 就可以了 无法导入Qt相关的插件 qt qpa plug
  • PCL调错:(3)error C2589“(“:“::“右边的非法标记

    错误提示 造成该错误的原因是 pcl库中的函数模板max与Visual C 中的全局的宏max冲突 百度了以下看了一共有两种解决方案 第一种不用修改库里边的源代码 设置项目属性 在预定义处理器中添加定义NOMINMAX来禁止使用Visual
  • Android 旧项目引入 (kotlin)插件简单记录

    1 确认自己 AS 的kotlin 插件 已经安装 2 选择kotlin plugin updates 文件显示 3 选择configure kotlin in project 进入选择 Android gradle 的选项 由于我这边配置
  • JAVA中数组冒泡排序和选择排序

    冒泡排序的思想 两两之间比较大小 小的数在前 大的数在后 共比较i 1次 static void MaoPaoArray int a for int i 0 i lt a length 2 i for int j 0 j lt a leng
  • tortoisegit 常见错误disconnected no supported authentication methods available(server sent: publickey)

    本文转载自 https blog csdn net yym6789 article details 53807640 1 安装好小乌龟git后 用小乌龟的pull 从github上拉取项目 遇到错误 disconnected no supp
  • 7 整数反转 c++

    leetcode7 整数反转 题目描述 给出一个 32 位的有符号整数 你需要将这个整数中每位上的数字进行反转 注意 如果反转后整数溢出那么就返回 0 算法思路 使用一个64位的long long类型来存储结果整数 避免反转后结果溢出报错
  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • 在openwrt使用C语言增加ubus接口(包含C uci操作)

    在openwrt使用C语言增加ubus接口 包含C uci操作 文章目录 在openwrt使用C语言增加ubus接口 包含C uci操作 创建自己的软件包 软件包结构 编写代码和启动脚本 重点 案例大致分析 实现过程 ubus demo i
  • java调用脚本语言笔记(jython,jruby,groovy)

    java调用脚本语言笔记 jython jruby groovy 有两种方法 1 java se 6以后实现了jsr 223规范 java代码 java view plain copy ScriptEngineManager factory