`
alexcheng
  • 浏览: 181912 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK 5, JSR223, Rhino, E4X (1)

    博客分类:
  • Java
阅读更多
前面的一篇博客中,我写了怎么在JDK5的环境下使用Rhino的E4X功能,下面要说的是如何在JDK5中使用JSR223的Scripting框架。JSR223即javax.script包是JDK6.0才引入的,并且集成了Rhino作为JavaScript的引擎。不过JDK6集成的Rhino是经过删减功能的,包括主要的E4X没有加入。需要解决的问题有几个:

首先把JSR223的JDK6的实现剥离出来,这个容易,找到JDK6安装目录下面的rt.jar,保留javax.script和com.sun.script两个包,删除其余的文件夹,把此jar命名为jsr223.jar。此外在META-INF下面添加services文件夹,里面添加文件内容为com.sun.script.javascript.RhinoScriptEngineFactory的javax.script.ScriptEngineFactory文件。这完成了最基本的功能,不过这还不够。因为默认的com.sun.script.javascript.RhinoScriptEngine的实现中,把E4X禁用掉了。做法是我前面说的一样,反编译之后可以看到:

java 代码
  1. ContextFactory.initGlobal(new ContextFactory() {   
  2.   
  3. protected Context makeContext()   
  4. {   
  5. Context context = super.makeContext();   
  6. context.setClassShutter(RhinoClassShutter.getInstance());   
  7. context.setWrapFactory(RhinoWrapFactory.getInstance());   
  8. return context;   
  9. }   
  10.   
  11. public boolean hasFeature(Context context, int i)   
  12. {   
  13. if(i == 6)   
  14. return false//此处是关键   
  15. else  
  16. return super.hasFeature(context, i);   
  17. }   
  18.   
  19. }   
  20. );   

从代码中可以看到,6就是E4X的feature,默认的处理是直接返回false,要把它改成返回true。由于没有源代码,所以解决办法就只有一个,直接生成Java字节码。这个很多工具可以做到,我用的是ASM,首先查看原始的RhinoScriptEngine$1.class的字节码,然后修改一处地方就可以了。用此class文件替换到原来的,就完成了第一步。

第二步是因为JDK6对Rhino做了很多修改,很多类都去掉或者进行了修改,类所在的包也变化了。因此有两种方案,一种是修改com.sun.script下面的class文件,让它加载我们提供的org.mozilla.javascript下面的类,不过这会修改多个class文件,不理想。所以我的方案是把已有的Rhino的源代码结构修改成现有的sun实现的结构,删除掉sun原来的Rhino的类,这样com.sun.script下面的类就会加载完整功能的Rhino了。要完成这样的功能,需要对Rhino的代码进行修改,把org.mozilla映射到sun.org.mozilla,org.mozilla.javasscript下面的映射到sun.org.mozilla.javascript.internal。我写了一个Python脚本来完成这个工作。编译这些文件就可以得到新的jar,放到classpath下面就可以了。

至此,就可以在JDK 6中利用JSR223来使用Rhino的E4X了。测试一下就可以了:

java 代码
  1. ScriptEngineManager sem = new ScriptEngineManager();   
  2. ScriptEngine engine = sem.getEngineByName(”js”);   
  3. if (engine != null) {   
  4.   String str = “var i = Math.cos(Math.PI);print(i);var order = <order><person>alex</person></order>;print(order.person);”;   
  5.   try {   
  6.      Object result = engine.eval(str);   
  7.      System.out.println(result);   
  8.   } catch (ScriptException e) {   
  9.     e.printStackTrace();   
  10.   }   
  11. }   

下载地址:suncrack.jar

分享到:
评论
1 楼 zhch200 2008-11-03  
好复杂,我看我还是直接使用JDK1.6吧

相关推荐

    jdk-11.0.19-linux-x64-bin.tar.gz文件(分享给需要的同学)

    jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_...

    jdk-7u80-windows-x64安装包

    jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...

    livetribe-jsr223.jar

    livetribe-jsr223.jar 使jdk1.5支持jbpm4,weblogic9支持jbpm4

    jdk-17.0.5 (jdk-17-windows-x64-bin.zip)

    jdk-17.0.5 (jdk-17_windows-x64_bin.zip)适用于Windows x64 系统 :是 Java SE 平台的最新长期支持版本。根据Oracle 免费条款和条件许可,JDK 17 二进制文件可在生产中免费使用,并可免费重新分发。

    最新版jdk jdk-21-linux-x64-bin.deb

    安装jdk-21_linux-x64_bin.deb包在兼容的Linux系统上相对简单。一旦安装完成,用户可以通过命令行工具或集成开发环境(IDE)开始开发和调试Java应用。此外,jdk-21还支持最新的Java特性和标准,确保开发者可以利用...

    jdk-11.0.4_windows-x64_bin.zip

    3. **动态类型语言支持(JEP 330)**:JDK 11添加了对JSR 223(Scripting for the Java Platform)的更新,增强了对动态类型语言的支持,比如Groovy和JavaScript。 4. **本地变量类型推断(JEP 286)**:引入了"var...

    最新版windows jdk-11.0.17-windows-x64-bin.zip

    1. JDK 11.0.17概述: JDK 11.0.17是Java 11的一个重要更新,包含了多项性能优化、安全修复和新特性。其中,Java 11是长期支持(LTS)版本,意味着它将得到更长时间的维护和支持,适合企业级应用。64位版本的JDK...

    jdk-16_windows-x64_bin.zip

    1. **JDK安装与配置**: JDK的安装通常包括解压zip文件,然后将安装目录添加到系统的PATH环境变量中。这样,命令行就可以识别javac(Java编译器)和java(Java虚拟机)等命令。 2. **JDK 16的新特性**: - **记录...

    jdk11 jdk-11.0.7_windows-x64_bin 网盘下载

    ### JDK 11 (JDK-11.0.7) for Windows x64 版本概述 #### 一、JDK 11 简介 Java Development Kit(简称JDK)是Sun Microsystems(现在由Oracle公司拥有)提供的Java标准开发工具包。自Java 9 开始,Java采取了新的...

    jdk-11.0.19-windows-x64-bin.rar

    1. **HTTP Client (JSR 353)**:JDK 11中内置了一个新的HTTP客户端API,使得开发人员可以直接在Java标准库中处理HTTP请求,无需依赖第三方库。 2. **模块系统增强**:JDK 11进一步完善了Java 9引入的模块化系统,...

    jdk-12.0.2_linux-x64_bin.tar.gz官网下载

    1. **下载**:从Oracle官方网站获取"jdk-12.0.2_linux-x64_bin.tar.gz"文件。这个文件是一个压缩的归档,包含了所有必要的二进制文件和库。 2. **解压**:使用tar命令解压文件。例如,`tar -zxvf jdk-12.0.2_linux-...

    最新版linux jdk-17-linux-x64-bin.tar.gz

    最新版linux jdk-17_linux-x64_bin.tar.gz最新版linux jdk-17_linux-x64_bin.tar.gz最新版linux jdk-17_linux-x64_bin.tar.gz

    jdk-20-windows-x64-bin.msi windows64位安装包jdk

    jdk-20_windows-x64_bin.msi windows64位安装包jdk

    jdk-14.0.2_windows-x64_bin.exe.zip

    标题中的"jdk-14.0.2_windows-x64_bin.exe.zip"表明这是一个Java Development Kit(JDK)的安装程序文件,版本为14.0.2,适用于Windows操作系统,且是64位版本。JDK是Oracle公司提供的用于开发和运行Java应用程序的...

    jdk-16.0.1_windows-x64_bin.exe.zip

    标题中的"jdk-16.0.1_windows-x64_bin.exe.zip"表明这是一个Java Development Kit(JDK)的安装程序,版本号为16.0.1,专为Windows操作系统设计,且适用于64位(x64)架构。JDK是Java编程语言的核心组成部分,它包含...

    最新版windows jdk-20-windows-x64-bin.zip

    最新版windows jdk-20_windows-x64_bin.zip最新版windows jdk-20_windows-x64_bin.zip最新版windows jdk-20_windows-x64_bin.zip

    最新版windows jdk-11.0.19-windows-x64-bin.zip

    1. **下载安装文件**:首先,你需要从官方渠道下载“jdk-11.0.19_windows-x64_bin.exe”这个安装包。这是一份可执行文件,专为Windows 64位系统设计。 2. **运行安装程序**:双击下载的.exe文件,启动安装向导。...

    jdk-11.0.10_windows-x64_bin.7z

    3. **动态类型语言支持(JEP 335)**:JDK 11添加了对JSR 223(Scripting for the Java Platform)的更新,增强了对动态类型语言的支持。 4. **文本块(Text Blocks)**:为了解决多行字符串的问题,JDK 11引入了...

    jdk-10.0.1_windows-x64.exeJDK10安装包

    jdk-10.0.1_windows-x64.exeJDK10安装包jdk-10.0.1_windows-x64.exeJDK10安装包jdk-10.0.1_windows-x64.exeJDK10安装包

    jdk-15.0.2_windows-x64_bin.zip

    JDK 15.0.2 是Oracle公司发布的针对Windows x64平台的一个版本,它包含了Java编译器、Java虚拟机(JVM)、Java类库以及各种开发和调试工具,是Java开发者不可或缺的基础工具。 标题中的"jdk-15.0.2_windows-x64_bin...

Global site tag (gtag.js) - Google Analytics