在
前面的一篇博客中,我写了怎么在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 代码
- ContextFactory.initGlobal(new ContextFactory() {
-
- protected Context makeContext()
- {
- Context context = super.makeContext();
- context.setClassShutter(RhinoClassShutter.getInstance());
- context.setWrapFactory(RhinoWrapFactory.getInstance());
- return context;
- }
-
- public boolean hasFeature(Context context, int i)
- {
- if(i == 6)
- return false;
- else
- return super.hasFeature(context, i);
- }
-
- }
- );
从代码中可以看到,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 代码
- ScriptEngineManager sem = new ScriptEngineManager();
- ScriptEngine engine = sem.getEngineByName(”js”);
- if (engine != null) {
- String str = “var i = Math.cos(Math.PI);print(i);var order = <order><person>alex</person></order>;print(order.person);”;
- try {
- Object result = engine.eval(str);
- System.out.println(result);
- } catch (ScriptException e) {
- e.printStackTrace();
- }
- }
下载地址:suncrack.jar
分享到:
相关推荐
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-...
livetribe-jsr223.jar 使jdk1.5支持jbpm4,weblogic9支持jbpm4
jdk-17.0.5 (jdk-17_windows-x64_bin.zip)适用于Windows x64 系统 :是 Java SE 平台的最新长期支持版本。根据Oracle 免费条款和条件许可,JDK 17 二进制文件可在生产中免费使用,并可免费重新分发。
安装jdk-21_linux-x64_bin.deb包在兼容的Linux系统上相对简单。一旦安装完成,用户可以通过命令行工具或集成开发环境(IDE)开始开发和调试Java应用。此外,jdk-21还支持最新的Java特性和标准,确保开发者可以利用...
3. **动态类型语言支持(JEP 330)**:JDK 11添加了对JSR 223(Scripting for the Java Platform)的更新,增强了对动态类型语言的支持,比如Groovy和JavaScript。 4. **本地变量类型推断(JEP 286)**:引入了"var...
1. JDK 11.0.17概述: JDK 11.0.17是Java 11的一个重要更新,包含了多项性能优化、安全修复和新特性。其中,Java 11是长期支持(LTS)版本,意味着它将得到更长时间的维护和支持,适合企业级应用。64位版本的JDK...
1. **JDK安装与配置**: JDK的安装通常包括解压zip文件,然后将安装目录添加到系统的PATH环境变量中。这样,命令行就可以识别javac(Java编译器)和java(Java虚拟机)等命令。 2. **JDK 16的新特性**: - **记录...
### JDK 11 (JDK-11.0.7) for Windows x64 版本概述 #### 一、JDK 11 简介 Java Development Kit(简称JDK)是Sun Microsystems(现在由Oracle公司拥有)提供的Java标准开发工具包。自Java 9 开始,Java采取了新的...
1. **HTTP Client (JSR 353)**:JDK 11中内置了一个新的HTTP客户端API,使得开发人员可以直接在Java标准库中处理HTTP请求,无需依赖第三方库。 2. **模块系统增强**:JDK 11进一步完善了Java 9引入的模块化系统,...
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
jdk-20_windows-x64_bin.msi windows64位安装包jdk
标题中的"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"表明这是一个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
1. **下载安装文件**:首先,你需要从官方渠道下载“jdk-11.0.19_windows-x64_bin.exe”这个安装包。这是一份可执行文件,专为Windows 64位系统设计。 2. **运行安装程序**:双击下载的.exe文件,启动安装向导。...
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 15.0.2 是Oracle公司发布的针对Windows x64平台的一个版本,它包含了Java编译器、Java虚拟机(JVM)、Java类库以及各种开发和调试工具,是Java开发者不可或缺的基础工具。 标题中的"jdk-15.0.2_windows-x64_bin...