阅读更多

7顶
1踩

编程语言

原创新闻 Java 6: 通过新的Scripting引擎使用Python

2008-07-15 16:56 by 副主编 QQbyte 评论(11) 有9223人浏览
你有没有写过和外部进程或者系统交互的Java代码?你有没有希望使用脚本(Scripting)语言来写?如果你使用Java 6,Java 6提供了一个清晰的解决方案在JVM中跑Scripts,并且允许Java代码使用Script组件。

下面是一个Python的例子,借助jython的帮助,我们通过Java接口调用Python组件,使用简单的factory函数,我们能够类似Java对象一样运行scripts。

首先写一个Python scripts,来定义PulsePackage 和 Pulse 类。

class PulsePackage:
   
  def __init__(self, packageFile):
    self.packageFile = packageFile
   
  def extractTo(self, destDir):
    if not os.path.exists(destDir):
      os.makedirs(destDir)
       
    var = {‘destDir’:destDir, ‘packageFile’:self.packageFile}
      if self.packageFile.endswith(‘.zip’):
        os.system(“unzip -qd %(destDir)s %(packageFile)s” % var)
      else:
        os.system(“tar -zxC %(destDir)s -f %(packageFile)s” % var)
       
    return Pulse(os.path.join(destDir, self.getBasename()))
       
class Pulse:

  def __init__(self, baseDir, port=8080):
    “”” snipped ““”
       
  def start(self, wait=True, service=False):
    “”” snipped ““”
       
  def stop(self, timeout=60, service=False):
    “”” snipped ““”



然后我们定义一个 Java 接口描述这些 python classes.

public interface PulsePackage
{
  Pulse extractTo(String target);
}

public interface Pulse
{
  void start();
 
  void stop();
}


然后,我们定义一个factory函数提供在Java tests中运行Python对象权限。

public class JythonPulsePackageFactory
  implements PulsePackageFactory
{
  private File scripts = null;
   
  private Invocable invocableEngine;

  public JythonPulsePackageFactory()
  {
    this.scripts = new File(“scripts”);

    ScriptEngine jythonEngine =
        new ScriptEngineManager().
            getEngineByName(“python”);
       
    // the packageFactory.py script
    // contains our python class
    // definitions, and is loaded
    // here into the script engine.
    Reader script = new FileReader(
      new File(scripts, “packageFactory.py”));
    jythonEngine.eval(script);

    // this invocable engine now
    // allows us access to execute
    // python defined methods.
    invocableEngine =
      (Invocable) jythonEngine;
  }

  public PulsePackage createPackage(File pkg)
    throws Exception
  {
    // the createPackage method is
    // implemented in python, and
    // returns an instance (handle)
    // to python implemented extension
    // of our PulsePackage interface.
    return (PulsePackage)
      invocableEngine.invokeFunction(
          “createPackage”, pkg.getCanonicalPath());
  }
}


最后,魔法发生,我们通过在python script中定义package函数抹去了java和python的鸿沟。

def createPackage(packageFile):
    return PulsePackage(packageFile)


更新 python 类定义,扩展java接口

class Pulse(com.zutubi.pulse.acceptance.Pulse):
  “”” <snipped> ““”

class PulsePackage(com.zutubi.pulse.acceptance.PulsePackage):
  “”” <snipped> ““”


最后的运行结果:

File pkg =  new File(“testing-packages/pulse-2.0.0.zip”);

JythonPulsePackageFactory factory =
    new JythonPulsePackageFactory();

PulsePackage pulsePackage = factory.createPackage(pkg);

File destDir = new File(“tmp”);
Pulse pulse = pulsePackage.extractTo(destDir.getCanonicalPath());
pulse.start();

7
1
评论 共 11 条 请登录后发表评论
11 楼 meng9999 2008-08-10 11:55
这个实现是不错,就是性能上,应该会有点问题, 我原来也用 java写接口,然后用groovy写实现,在java里头动态调用grovvy的方法; 可是没有敢在项目中应用;
10 楼 ray_linn 2008-07-16 21:37
这么复杂,顶什么用?
9 楼 kingwang520 2008-07-16 17:16
海纳百川 有容乃大
8 楼 qsrock 2008-07-16 09:43
这样很麻烦,问题是有没有用啊
7 楼 linginfanta 2008-07-16 09:38
没有看懂。
6 楼 helyho 2008-07-16 00:04
虽然没有看的完全明白(本人不懂python),但是我认可他很牛
5 楼 williamy 2008-07-15 23:08
支持JVM平台化,不然以后怎么混
4 楼 yunsong 2008-07-15 19:10
就应该这样,做平台
3 楼 hellas 2008-07-15 18:11
java好是好,就是配置太麻烦,太笨重,不像python,清清爽爽的。
2 楼 ln1058 2008-07-15 18:07
太强大了
支持
1 楼 QQbyte 2008-07-15 16:56
Java越来越象一个平台,可以跑各种语言,而不是一种语言而已。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 内存检测工具purify的简介

    内存检测工具purify的简介。内存检测工具purify的简介。内存检测工具purify的简介。内存检测工具purify的简介。内存检测工具purify的简介。

  • C/C++内存问题检查利器——Purify

    转自 http://blog.csdn.net/haoel/article/details/2900 陈皓 一、           引言   我们都知道软件的测试(在以产品为主的软件公司中叫做QA—Quality Assessment)占了整个软件工程的30% -50%,但有这么一种说法,即使是最优秀测试专家设计出来的测试案例,也无法彻底地检测到内存上的问题。

  • C++内存泄露和检测

    C++中的内存泄露的原因和内存泄露的检测方法。

  • C++内存检查

    内存泄漏是程序中常见,也是最令人痛苦的一种bug。好在有一些检查工具可以帮助我们,这里介绍一个google 提供的简单直接的工具。

  • C/C++内存问题检查利器—Purify (四)

    七、             Purify的退出码 像UNIX下的软件,一般都会提供和别的应用程序的接口,像上面的生成文本文件,也是给别的应用程序提供接口的一种方式。这里,我们所要讲述的是Purify的退出码,我们知道程序都有退出码,以提供给别的程序或操作系统自己运行的信息。被Purify编译过的程序,你可以通过指定-exit-status参数来告诉Purify是否用Purify的退出码,如果这

  • 如何查看一个类的内存布局

    在逛论坛时候,看到一个一星大神的留言,赶紧抄过来,哈哈 ~ 如何查看一个类的内存布局: 如果想查看文件Program.cpp中的类D的对象在内存中的分布情况,先进入cmd命令窗口,改变目录到Program.cpp所在的目录,然后键入如下命令:cl Program.cpp /d

  • C++ 内存问题排查原理与工具

    C++ 内存问题排查

  • C++ 虚函数表解析---陈皓改进版

    修正了一些原文中的错误。 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术(Run-Time Type Identification),虚函数技术,要...

  • C/C++内存泄漏及检测

    wikipedia中这样定义内存泄漏:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。

  • C++ 类 内存分布 虚函数 单继承 多继承

    C++ 类 内存分布 虚函数 单继承 多继承 重点内容 一、首先看看没有继承情况下类的内存分布: 1.1 定义一个简单的类,没有虚函数。 代码如下:#include<iostream> using namespace std; class Base { public: int Base_1; int Base_2; public: void func1(); }; i

  • C/C++内存检测工具valgrind--memcheck

    Valgrind简介 Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O’Reilly开源大奖的Julian Seward,它包含一个内核 —— 一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测,我们可以使用它的工具:Memcheck。 Valgrind安装 方法 1. valgrind官网:http://valgrind.org下载 方法 2. Ubuntu: sudo apt-get install

  • 【转】内存溢出处理方法

    原文:http://dowhile.net/forum.php?mod=viewthread&amp;tid=531最近做了个任务,内存溢出问题;静态影像下无问题,可是在动态影像下执行rep时量测元素400-500笔时就会内存溢出,调试很久也无进展,求教各方圣神终无结果,最后找出一篇文章供大家赏阅。如遇到内存溢出问题时或许有点帮助。还有可以链接下载的内存检测工具1. ccmalloc...

  • 使用Purify检查内存泄漏

    使用Purify检查内存泄漏 使用Purify检查内存泄漏 使用Purify检查内存泄漏 使用Purify检查内存泄漏

  • purify内存检测工具

    purify内存检测工具

  • C++ 实现内存泄露检查

    内存泄漏一直是 C++ 中比较令人头大的问题, 即便是很有经验的 C++程序员有时候也难免因为疏忽而写出导致内存泄漏的代码。除了基本的申请过的内存未释放外,还存在诸如异常分支导致的内存泄漏等等。本项目将使用 C++ 实现一个内存泄漏检查器。 要检测一个长期运行的程序是否发生内存泄露通常是在应用中设置检查点,分析不同检查点中内存是否长期保持占用而未释放,从本质上来说,这与对一个短期运行的程序进行内存泄露检查是非常类似的。所以本项目中的内存泄漏检查器将实现一个用于短期内存泄露的检查器。 ...

  • C++类内存分布

    书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。 工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C++-&gt;命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布...

  • c++ 系统内存检查(Linux)

    c++ 系统内存检查(Linux) 文章目录c++ 系统内存检查(Linux)检查内存泄露检查堆溢出检查栈溢出检查全局内存溢出检查释放后继续使用 检查内存泄露 通过g++来检查内存泄露的问题 # g++ g++ -fsanitize=address -g -o testmen testmem.cpp # CMakeLists.txt 里面添加 set(CMAKE_CXX_FLAGS "-fsanitize=address") 使用-fsanitize=address开关以后,代码不用做任何改动,就自动具有

  • C++实现内存泄漏检查

    对应用程序堆内存分配器(C:malloc、calloc、realloc、free,C++:new、delete、new[]、delete[])进行接管,用链表记录管理堆内存分配和释放,在程序退出时将未释放的内存信息输出至文本。

  • c/c++内存泄漏检测工具(上)

    1/  VC自带的CRT:_CrtCheckMemory   调试器和 CRT 调试堆函数 用法 /************************************************************************ *   环境:VC6.0 *   程序功能:CRT 检测内存泄漏      *   创建:  2014/3/20 * *   版本号:1.

Global site tag (gtag.js) - Google Analytics