`
yinxvxv
  • 浏览: 51810 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

阅读更多

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

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"
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)

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"
scriptEngine.eval(code);

 

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

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec(code);

 

访问数据库
使用jdbc:

from oracle.jdbc.driver import OracleDriver
from java.sql import DriverManager

username = 'hr'
password = '123456'
url = 'jdbc:oracle:thin:@localhost:1521:XE'
driver = OracleDriver()
DriverManager.registerDriver(driver)
conn = DriverManager.getConnection(url, username, password)
stmt = conn.createStatement()
sql = "select salary from EMPLOYEES t where t.salary<2300"
rs = stmt.executeQuery(sql)
while (rs.next()):
 print rs.getInt('salary')
rs.close()
stmt.close()

 结果:
2200
2100
2200

 

使用zxJDBC :

from com.ziclix.python.sql import zxJDBC

url = 'jdbc:oracle:thin:@localhost:1521:XE'
username = 'hr'
password = '123456'
driverName = 'oracle.jdbc.driver.OracleDriver'
mysqlConn = zxJDBC.connect(url,username, password,driverName)
cursor = mysqlConn.cursor()     
cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");
#print cursor.fetchone()
list = cursor.fetchall()
for record in list:
    print "name:"+record[0]
#print cursor.description[0]
#print cursor.description[1]

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

 

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

 

与jruby集成
使用jsr223:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"
scriptEngine.eval(code);

 访问数据库

require 'java'

module JavaLang
  include_package "java.lang"
end

module JavaSql
  include_package 'java.sql'
end

begin
 username = 'hr'
 password = '123456'
 url = 'jdbc:oracle:thin:@localhost:1521:XE'
 driverName = 'oracle.jdbc.driver.OracleDriver'
 JavaLang::Class.forName(driverName).newInstance
 conn = JavaSql::DriverManager.getConnection(url, username, password)
 stmt = conn.createStatement
 sql = "select last_name from EMPLOYEES t where t.salary<2300"
 rs = stmt.executeQuery(sql)
 while (rs.next) do
  puts "名字:"+rs.getString("last_name")
 end
 rs.close
 stmt.close
 conn.close()
rescue JavaLang::ClassNotFoundException
 puts "ClassNotFoundException"
rescue JavaSql::SQLException
 puts "SQLException"
end

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

 

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

 

与groovy集成
使用jsr223:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"
scriptEngine.eval(code);

 使用GroovyShell:

GroovyShell shell = new GroovyShell();
Script script = shell.parse(code);
Object result = script.run();

 访问数据库

import groovy.sql.Sql

def username = 'hr'
def password = '123456'
def url = 'jdbc:oracle:thin:@localhost:1521:XE'
def driverName = 'oracle.jdbc.driver.OracleDriver'
def sql = Sql.newInstance(url, username, password, driverName)

sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {
 println "名字:${it.last_name}"
}

 结果:
名字:麦克
名字: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运行时处理的内容)

 

2
0
分享到:
评论
1 楼 song_27149 2017-11-03  
groovy异常说明解决了我目前的问题,十分感谢!

相关推荐

    请放弃 Jruby和Jython 而选择 Groovy

    这三种语言都能够在Java虚拟机(JVM)上运行,为Java平台带来脚本语言的便捷性。然而,根据标题和描述,本文将重点讨论为什么Groovy可能成为Java开发者更优的选择。 首先,让我们逐一了解这三种语言: 1. **Jruby*...

    java调用python脚本

    总之,Java调用Python脚本是一个实用的技巧,它允许开发者结合两种语言的优点,提高代码的可维护性和复用性。通过理解上述概念和实践,你可以灵活地在Java项目中嵌入Python功能。如果有任何疑问,可以参考解压后的...

    java与脚本语言.rar

    Java是一种广泛使用的面向对象的编程语言,而脚本语言则以它们的轻量级、解释执行和快速开发特性而闻名。两者在软件开发领域中各有所长,常常被用来解决不同的问题。本压缩包文件“java与脚本语言.rar”可能包含关于...

    jython-standalone-2.7.0.jar

    《Java调用Python脚本:Jython详解及应用》 在现代软件开发中,常常需要在不同的编程语言之间进行交互,比如Java与Python。Jython是这样一种工具,它允许Java开发者无缝地运行Python代码,使得Java应用可以利用...

    java脚本编程

    不过,Java生态系统中有多种脚本语言可以运行在Java平台上,例如Groovy、JRuby等。下面将详细介绍这些概念和技术。 ### Java与脚本语言 #### Java简介 Java是一种广泛使用的通用编程语言,由Sun Microsystems开发...

    Java脚本教程(学习资料)

    这个API允许Java应用程序与各种脚本语言进行交互,比如JavaScript、Groovy、Jython和JRuby等。下面将详细介绍Java Scripting API的主要组件和使用方法。 1. **ScriptEngine接口**: `ScriptEngine`是Java ...

    Java调用python的方法(jython)

    Java调用Python的方法是使用Jython实现的,Jython是一门语言,它不是Java或Python的解释器,而是一种能够实现Java和Python代码互相访问的技术。 什么是Jython?Jython是一种语言,它可以实现Java和Python代码的互相...

    Java调用Python.zip

    本示例探讨了如何使用Java调用Python脚本,实现数据交换和处理。Java和Python结合使用,可以充分利用Java的高效性能和Python的易用性及丰富的库资源。 Java调用Python主要依赖于Jython、Apache Beam、Java的Runtime...

    利用Rserve实现Java调用R脚本.pdf

    本文讲述了Java与R语言的整合使用,以及如何通过Rserve实现远程调用R脚本的功能,从而扩展Java在数据分析和可视化方面的能力。首先,文中阐述了Java和R语言各自的强项与不足,指出Java虽然在应用开发方面表现出色,...

    java调用python入门详解

    在IT行业中,跨语言交互是一种常见的需求,Java和Python作为两种广泛应用的编程语言,它们之间的互相调用可以实现各自优势的互补。本项目名为“java调用python入门详解”,主要展示了如何在Java程序中调用Python脚本...

    java中jython操作把python数据类型转成java类型

    在Java中,Jython是一个非常有用的工具,它允许我们在Java应用程序中嵌入Python代码,并能够无缝地在Python数据类型和Java数据类型之间进行转换。这极大地扩展了Java的生态系统,让我们能够利用Python丰富的库和简洁...

    Java中调用Python代码

    本篇将详细探讨如何在Java中调用Python代码,以便充分利用两种语言的优点。 首先,我们需要了解Java与Python交互的几种常见方式: 1. **Jython**: Jython是一种Python的实现,它运行在Java平台上,可以直接执行...

    Jython示例

    1. **语言融合**:Jython结合了Python的易用性和Java的高性能,使得开发人员可以在两个世界之间自由切换。 2. **可移植性**:因为Jython运行在JVM上,所以它具有Java的跨平台特性,能在任何支持JVM的系统上运行。 3....

    使用 Java 调用基础 Python 机器学习脚本(包括数据预处理、训练集验证集划分、模型训练、预测).zip

    跨语言调用可能会带来性能损耗,因此在实际应用中,我们可能需要考虑优化,如缓存中间结果、批量处理数据或使用更高效的交互方式(如 Jython 或 JPype)。此外,确保 Java 和 Python 的环境配置正确,避免因版本不...

    java调用python中的自定义函数函数

    在IT开发领域,跨语言交互是常见的需求,例如在Java后端应用中调用Python脚本或库。本文将深入探讨如何在Java中调用Python的自定义函数,特别是执行加法运算。我们将重点关注以下几个方面:Java与Python的互操作性、...

    java android 执行脚本代码(java代码)

    - **JSR 223 Scripting**: Android支持JSR 223规范,允许使用各种脚本语言(如Groovy、JavaScript等)编写代码,然后通过`ScriptEngineManager`和`ScriptEngine`接口执行。 5. **AOSP源码集成**: - 对于更复杂的...

    Java实现调用jython执行python文件的方法

    Java 实现调用 Jython 执行 Python 文件的方法 本文主要介绍了 Java 实现调用 Jython 执行 Python 文件的方法,结合实例形式分析了 Java 调用 Jython 执行 Python 文件的常见操作技巧及相关问题解决方法。 Title ...

    用java调用python

    JythonBridge 提供了与 Py4J 类似的功能,但它基于 Jython,允许直接在 Java 中运行 Python 代码,而不仅仅是调用 Python 脚本。 6. **使用 JPype**: JPype 是一个开源项目,它实现了 Python 和 Java 之间的互...

Global site tag (gtag.js) - Google Analytics