使用Rhino让java执行javascript的方法实例

2014-12-21  来源:本站原创  分类:Java  人气:12 

这篇文章主要介绍了java使用Rhino执行javascript的方法,Rhino由Mozilla开发,是 JavaScript 一种基于Java的实现

下载Rhino https://developer.mozilla.org/en-US/docs/Rhino

把js.jar拷贝到项目工程

实现从Java中执行js中的函数、从js中调用Java中的方法,代码:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView text1 = (TextView) findViewById(android.R.id.text1);
        TextView text2 = (TextView) findViewById(android.R.id.text2);
        text1.setText(runScript(JAVA_CALL_JS_FUNCTION, "Test", new String[] {}));
        text2.setText(runScript(JS_CALL_JAVA_FUNCTION, "Test", new String[] {}));
    }
    /** Java执行js的方法 */
    private static final String JAVA_CALL_JS_FUNCTION = "function Test(){ return '农民伯伯 java call js Rhino'; }";
    /** js调用Java中的方法 */
    private static final String JS_CALL_JAVA_FUNCTION = //
    "var ScriptAPI = java.lang.Class.forName(\"" + MainActivity.class.getName() + "\", true, javaLoader);" + //
        "var methodRead = ScriptAPI.getMethod(\"jsCallJava\", [java.lang.String]);" + //
        "function jsCallJava(url) {return methodRead.invoke(null, url);}" + //
        "function Test(){ return jsCallJava(); }";
    /**
     * 执行JS
     *
     * @param js js代码
     * @param functionName js方法名称
     * @param functionParams js方法参数
     * @return
     */
    public String runScript(String js, String functionName, Object[] functionParams) {
        Context rhino = Context.enter();
        rhino.setOptimizationLevel(-1);
        try {
            Scriptable scope = rhino.initStandardObjects();
            ScriptableObject.putProperty(scope, "javaContext", Context.javaToJS(MainActivity.this, scope));
            ScriptableObject.putProperty(scope, "javaLoader", Context.javaToJS(MainActivity.class.getClassLoader(), scope));
            rhino.evaluateString(scope, js, "MainActivity", 1, null);
            Function function = (Function) scope.get(functionName, scope);
            Object result = function.call(rhino, scope, scope, functionParams);
            if (result instanceof String) {
                return (String) result;
            } else if (result instanceof NativeJavaObject) {
                return (String) ((NativeJavaObject) result).getDefaultValue(String.class);
            } else if (result instanceof NativeObject) {
                return (String) ((NativeObject) result).getDefaultValue(String.class);
            }
            return result.toString();//(String) function.call(rhino, scope, scope, functionParams);
        } finally {
            Context.exit();
        }
    }
    public static String jsCallJava(String url) {
        return "农民伯伯 js call Java Rhino";
    }
}

注意,混淆的时候js.jar可能混淆不过去,请参照文章4.1的方法。

相关文章
  • 使用Rhino让java执行javascript的方法实例 2014-12-21

    这篇文章主要介绍了java使用Rhino执行javascript的方法,Rhino由Mozilla开发,是 JavaScript 一种基于Java的实现 下载Rhino https://developer.mozilla.org/en-US/docs/Rhino 把js.jar拷贝到项目工程 实现从Java中执行js中的函数.从js中调用Java中的方法,代码: public class MainActivity extends Activity { @Override protected vo

  • PowerShell中执行Javascript的方法示例 2013-12-24

    这篇文章主要介绍了PowerShell中执行Javascript的方法示例,特殊场景下可能会用到这个技巧,需要的朋友可以参考下 背景与问题 别人写了一个Web应用程序,使用的是ASP.NET Forms技术.其中用到了一个DropdownList控件,用户选择了某项后,页面会回传,然后在下面再动态的显示另外一个控件,逻辑很简单. 这是产生的的部分的html源码: <select name="eventTypeDropDown" id="eventTypeDropDown

  • java常见事件响应方法实例汇总 2013-11-06

    这篇文章主要介绍了java常见事件响应方法,对于初学者有很好的参考借鉴价值,分享给大家,需要的朋友可以参考下 本文实例汇总了java中常见的事件响应方法,包括容器类监听.监听器类.AbstractAction.反射等.以方便大家参考.具体方法如下: 首先,在Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件) 2.实现相关事件监听接口 3.注册事件源的动作监听器 4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应. 一.容器类监听 效果:单击窗体中

  • JavaScript实现Java中StringBuffer的方法 2013-10-31

    这篇文章主要介绍了JavaScript实现Java中StringBuffer的方法,实例分析了StringBuffer类的实现与使用技巧,需要的朋友可以参考下 本文实例讲述了JavaScript实现Java中StringBuffer的方法.分享给大家供大家参考.具体如下: Javascript StringBuffer类的实现是通过prototype构造一个StringBuffer类,代码如下: function StringBuffer() { this.__strings__ = new A

  • jQuery动画出现连续触发.滞后反复执行的解决方法 2014-06-16

    这篇文章主要介绍了jQuery动画出现连续触发.滞后反复执行的解决方法,实例分析了针对jQuery中slideUp.slideDown.animate等动画运用时出现的滞后反复执行等问题的解决方法,需要的朋友可以参考下 本文实例讲述了jQuery动画出现连续触发.滞后反复执行的解决方法.分享给大家供大家参考.具体分析如下: jQuery中slideUp .slideDown.animate等动画运用时,如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行,其表

  • Java操作Mysql的方法 2014-07-13

    这篇文章主要介绍了Java操作Mysql的方法,实例分析了Java针对有返回结果和没有返回结果的sql操作的相关技巧,需要的朋友可以参考下 本文实例讲述了Java操作Mysql的方法.分享给大家供大家参考.具体分析如下: 不同于C#操纵数据库的千篇一律,如果是要Java把操纵数据库的语句分为两种: 一种是有结果的select语句,还有一种是没结果的insert into,update,delete等语句 1.如果是有结果的select语句,则需要定义一个ResultSet变量来接,同时使用con

  • java执行Linux命令的方法 2013-10-29

    这篇文章主要介绍了java执行Linux命令的方法,涉及对Java中Runtime.exec()函数的应用,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了java执行Linux命令的方法.分享给大家供大家参考.具体实现方法如下: public class StreamGobbler extends Thread { InputStream is; String type; public StreamGobbler(InputStream is, String type) { thi

  • java执行bat命令碰到的阻塞问题的解决方法 2013-12-15

    这篇文章主要介绍了java执行bat命令碰到的阻塞问题的解决方法,有需要的朋友可以参考一下 使用Java来执行bat命令,如果bat操作时间过长,有可能导致阻塞问题,而且不会执行bat直到关闭服务器. 如: Runtime r=Runtime.getRuntime(); Process p=null; try{ String path = "D:/test.bat"; p = r.exec("cmd.exe /c "+path); p.waitFor(); }cat

  • android webview中使用Java调用JavaScript方法并获取返回值 2013-12-19

    这篇文章主要介绍了android webview中使用Java调用JavaScript方法并获取返回值,本文直接给出代码示例,需要的朋友可以参考下 在android平板上用webview打开一个网页,调用里面的javascript方法,同时相互传参. 网上例子很少啊,基本都不能获取返回值,贴一个自己最后调试完的代码如下: Java: protected void onCreate(Bundle savedInstanceState) { ........ x = (WebView)this.fi

  • ThinkPHP控制器里javascript代码不能执行的解决方法 2014-05-18

    这篇文章主要介绍了ThinkPHP控制器里javascript代码不能执行的解决方法,采用ThinkPHP的<literal>标签来解决javascript标签被解析的问题,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了ThinkPHP控制器里javascript代码不能执行的解决方法.分享给大家供大家参考.具体方法如下: 这里实例分析一下thinkphp在控制器里的网页特效代码不能执行解决方法,就拿"退出"这一项来说吧,我的"退出系统"链接是写

  • java和javascript中过滤掉img形式的字符串不显示图片的方法 2014-09-07

    这篇文章主要介绍了java和javascript中过滤掉img形式的字符串不显示图片的方法,以实例形式分别讲述了采用java和javascript实现过滤掉img形式字符串的技巧,需要的朋友可以参考下 本文实例讲述了java和javascript中过滤掉img形式的字符串不显示图片的方法.分享给大家供大家参考.具体实现方法如下: 1. javascript过滤掉<img></img>和<img />形式的字符串 <!DOCTYPE html PUBLIC &quo

  • C#执行Javascript代码的几种方法总结 2014-12-08

    本篇文章主要是对C#执行Javascript代码的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 一.开源项目 Javascript .NET 地址: http://javascriptdotnet.codeplex.com/ 它是Google Chrome V8引擎在.NET上的封装,功能完善,性能相对较高,推荐使用! (缺点就是asp.net web应用上,好象会报错) 示例代码: using Noesis.Javascript; using System; us

  • java执行windows下cmd命令的方法 2015-03-01

    这篇文章主要介绍了java执行windows下cmd命令的方法,较为详细的说明了Java执行Windows下CMD命令的方法,并总结了常用的CMD命令供大家参考,需要的朋友可以参考下 本文实例讲述了java执行windows下cmd命令的方法.分享给大家供大家参考. 具体实现代码如下: //获取运行时 Runtime rt = Runtime.getRuntime(); //获取进程 Process p = rt.exec(String[] cmdarray);//或者 Process p =

  • 优化javascript的执行效率一些方法总结 2015-03-07

    本文为大家介绍下优化javascript的执行效率一些方法,个人感觉还不错,感兴趣的朋友可以了解下 1.在低版本浏览器中(如IE6,IE7等)串联字符串时使用数组的join方法就比使用+号来连接高效很多(如['aaa','bbb','ccc'].join()比'aaa'+'bbb'+'ccc'高效): 2.Array: pop比shift高效,push比unshift高效.这对于设计二叉堆结构比较重要,将最大或者最小的元素放在数组末尾最好. 3.数字取整最好用移位操作: 1.1 >> 0; 4

  • Android中Java和JavaScript交互实例 2014-07-28

    这篇文章主要介绍了Android中Java和JavaScript交互实例,本文给出了实现方法.实现代码.js调用Java.java调用js等内容,需要的朋友可以参考下 Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如何实现 实现Java和js交互十分便捷.通常只需要以下几步. 1.WebView开启JavaScript脚本执行 2.WebView

  • 让Java跟Javascript更加亲密 2015-02-11

    在移动App开发中,为了快速迭代,通常都会使用Native+Web的模式开发.具体来说就是使用Java提供接口,使用WebView控件嵌套Web页面来实现UI和交互. 在Android中,Java可以很方便的提供接口给WebView中的Js进行调用,只要以下一行代码就能搞定: Java 1 mWebView.addJavascriptInterface(new JavascriptInterface(), "custom_name"); 这样,JavascriptInterface的所

  • Android Webview Java和Javascript安全交互 2015-04-23

    最近要对一个网页的源代码进行检测,Android Webview中没有直接获取网页源代码的接口,传统的addJavascriptInterface方法存在安全隐患,所以研究了一下Java和Javascript的安全交互. Android Webview漏洞 Android Webview有两个非常知名的漏洞: 最近爆出来的UXSS漏洞,可以越过同源策略,获得任意网页的Cookie等信息,Android 4.4以下都有此问题,基本无解,只能重新编译浏览器内核解决,详情可以参考最近移动安全三两事,感

  • java执行字符串数学表达式 ScriptEngine 2014-04-12

    今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如: Java代码 double d = (3+5-(2-4)*2)/24;没有问题 但是:遇到 "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了 java是无法解决,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类,所以就找到了方法,详细方

  • JS 在数组插入字符的实现代码(可参考JavaScript splice() 方法) 2013-10-07

    在数组插入字符,添加数组,删除数组可以用slice自带的方法.操作比较方便,这个代码是作者通过push与shift方法实现,只能是个思路,但不推荐这样的方法. Array.prototype.ArrayInsertAfter=function(Num,obj) { var tempArr=new Array(); var l=this.length; for(var i=0;i<l;i++) { tempArr.push(this.shift()); } l=tempArr.length; fo

  • Java的System.getProperty()方法获取大全 2013-10-08

    这篇文章主要介绍了Java的System.getProperty()方法获取大全,罗列了System.getProperty()方法获取各类信息的用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例汇总了Java的System.getProperty()方法获取信息的用法.分享给大家供大家参考.具体如下: System.out.println("java版本号:" + System.getProperty("java.version")); // java版