`
lineageII
  • 浏览: 81997 次
  • 来自: ...
社区版块
存档分类
最新评论

开心网acc的取得,java调用javascript的函数

阅读更多

参考

http://www.cnblogs.com/yesun/archive/2008/04/02/1134041.html

http://heisetoufa.iteye.com/blog/227714

package com.kaixin001.common;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;

public class ScriptHelper {

	private Context cx;

	private Scriptable scope;

	public ScriptHelper() {
		this.cx = Context.enter();
		this.scope = cx.initStandardObjects();
	}

	public Object runJavaScriptByFile(String filename) {
		String jsContent = this.getJsContent(filename);
		Object result = cx.evaluateString(scope, jsContent, filename, 1, null);
		return result;
	}

	public Object runJavaScript(String jsContent) {
		Object result = cx.evaluateString(scope, jsContent, "", 1, null);
		return result;
	}

	private static String getJsContent(String filename) {
		LineNumberReader reader;
		try {
			reader = new LineNumberReader(new FileReader(filename));
			String s = null;
			StringBuffer sb = new StringBuffer();
			while ((s = reader.readLine()) != null) {
				sb.append(s).append("\n");
			}
			return sb.toString();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	public Scriptable getScope() {
		return scope;
	}

	public static void main(String[] args) throws FileNotFoundException, IOException {
		String filename = System.getProperty("user.dir") + "/acc.htm";
		// String pattern = "";
		String accCode = "";
		String script = "";
		String script_tmp2 = "";
		String var_values = "";

		// 得到所有script段
		Pattern pattern = Pattern.compile("<script type=\"text/javascript\">.*?</script>", Pattern.DOTALL);
		Matcher matcher = pattern.matcher(getJsContent(filename));
		String jsContent = "";
		while (matcher.find()) {
			String js = matcher.group();
			if(js.contains("function  acc()")) {
				jsContent = js.replaceAll("<.*?script.*?>", "");
				//System.out.println(jsContent);
			}
		}

		String jsFunction = "acc";

		// 开始调用javascript函数
		Context cx = Context.enter();
		try {
			Scriptable scope = cx.initStandardObjects();
			cx.evaluateString(scope, jsContent, null, 1, null);

			Object fObj = scope.get(jsFunction, scope);
			if (!(fObj instanceof Function)) {
				System.out.println("找不到方法" + jsFunction);
			} else {
				Function f = (Function) fObj;
				Object result = f.call(cx, scope, scope, null);
				System.out.println("返回结果:" + Context.toString(result));
			}
		} finally {
			Context.exit();
		}

	}

}

 

 

分享到:
评论

相关推荐

    javascript函数大全

    ### JavaScript函数大全详解 在JavaScript编程语言中,各种内置函数为开发者提供了强大的工具箱,用于处理数字、字符串、数组以及日期等数据类型。本文将详细解释部分常用的JavaScript函数及其应用场景,帮助开发者...

    compose是对处理函数集functions组合后的复合函数的统称代码展示了三种不同的compose函数

    `reduceRight` 的回调函数接收两个参数:上一次调用的结果(`acc`)和当前遍历到的函数(`fn`)。每次迭代都将 `fn(acc)` 的结果赋值给 `acc`,最后返回 `x` 作为整个链条的起点。 - **闭包实现**: ```...

    acc:after函数的一个更通用的版本,它累积先前调用中的参数(包括错误)

    acc 函数的更通用版本,它累积先前调用中的参数(包括错误)。用法 var acc = require ( 'acc' ) var fn = acc ( 2 , function ( a , b , c ) { // This function is being invoked after two calls of fn() // ...

    jiecheng.rar_javascript

    在JavaScript中,我们可以编写函数来计算任意正整数的阶乘。 标题中的“jiecheng.rar_javascript”很可能是一个关于使用JavaScript实现阶乘计算的示例代码,其中“jiecheng.html”可能是展示这个功能的HTML页面,...

    Js构造函数及Json格式的字符串转对象等

    本文将深入探讨JavaScript中的一些关键概念,包括构造函数、JSON格式的字符串与对象之间的转换,以及如何操纵`this`指向。 一、数组操作: 在JavaScript中,我们可以轻松地对数组进行各种操作。例如,要找到数组`...

    用函数式编程技术编写优美的 JavaScript

    6. **尾调用优化**:虽然JavaScript的实现并非都支持尾调用优化,但在ES6中引入了这个概念,可以防止递归深度过大导致栈溢出。 7. **数组方法**:JavaScript的数组方法如`map`, `filter`, `reduce`, `forEach`等,...

    Javascript 是你的高阶函数(高级应用)

    JavaScript中的高阶函数是其灵活性和强大的功能之一,它允许函数作为其他函数的参数或返回结果。这样的特性使得代码更加模块化,提高了代码的重用性和可读性。以下是几个高阶函数的应用场景: 1. **回调函数**: ...

    tailcall:消除尾部递归函数调用

    尾叫tailcall是一个browserify转换和命令行实用程序,可用于消除递归函数中的尾部调用(TCO =尾部调用优化)。 这样可以防止使用的调用堆栈过度增长,并且通常可以提高性能(在大多数情况下)。 尾调用优化是...

    Typescript(ts)中的函数实例代码

    默认参数允许我们在定义函数时为参数提供一个默认值,如果调用函数时不传递该参数,则使用默认值: ```typescript function greet(name: string, greeting = 'Hello') { return `${greeting}, ${name}!`; } ``` ...

    js代码-函数调用的传值和传址

    通过理解JavaScript中函数调用的传值和传址机制,开发者可以更好地控制函数行为,避免意外的副作用,并有效地利用高级特性如默认参数、剩余参数和闭包。在编写复杂的JavaScript代码时,这些概念起着关键的作用。

    babel-plugin-tailcall-optimization:JavaScript的尾调用优化!

    带尾调用的原始函数: function counter ( n , acc = 0 ) { if ( n === 0 ) { return acc } else { return counter ( n - 1 , acc + 1 ) }} 被重写为: function counter ( n , acc = 0 ) { var _repeat = true ;...

    Js四则运算函数代码

    在加法操作中,`accAdd`函数处理了不同浮点数的小数位数,确保了在相加时保持正确的精度。它通过创建一个足够大的基数来存储最精确的小数位数,然后进行相应的计算。同样,我们通过添加`.add`方法到Number原型,使得...

    前端大厂最新面试题-compose.docx

    在这个面试题中,应聘者需要实现一个`compose`函数,它允许开发者将多个单参数函数组合成一个新的复合函数,从右到左顺序执行这些函数,将前一个函数的结果传递给后一个函数作为参数。 首先,让我们深入理解`...

    js代码-尾调用优化tco

    JavaScript中的尾调用优化(Tail Call Optimization,简称TCO)是一种优化策略,旨在提高递归函数的性能。在JavaScript中,当一个函数的最后一步是调用另一个函数,并且返回该调用的结果时,我们称这个调用为“尾...

    javascript加减乘除的简单实例.docx

    3. **加法函数(accAdd)**: 加法函数处理了两个数字可能存在的不同小数位数。它找到最大小数位数,创建一个乘数 `m = Math.pow(10, Math.max(t1, t2))`,然后将两个参数分别乘以 `m` 后相加,再除以 `m`,以得到...

    eslint-plugin-func-params-args:轻松灵活地限制函数参数和参数的数量!

    eslint-plugin-func-params-args ... 假设我们需要调用array.reduce ,有时需要在箭头函数表达式中使用所有提供给 reducer 回调的 4 个参数(如array.reduce((acc, val, index, arr) =&gt; {}, {})例如

    js 方法原理解析 apply、bind_js_前端

    首先,`apply`方法是JavaScript中Function对象的一个实例方法,它的主要作用是改变函数调用时的上下文(即`this`的指向)并可以接受一个数组或类数组对象作为参数传递给函数。例如: ```javascript function sum(a,...

    ECMAScript 6 技术扫盲,快速学习ES6,进入Javascript开发ES6时代

    - 箭头函数的 `this` 值取决于定义时所在的上下文,而不是调用时的上下文,这使得在某些场景下更容易管理。 #### 3. 函数参数默认值 ES6 允许开发者直接在函数声明时设置参数的默认值。这使得函数更具可读性和灵活...

    2021大厂前端面试高频代码题详解(二)1

    闭包是JavaScript编程中一个核心概念,它指的是一个函数能够访问并操作其外部作用域中的变量,即使这个函数在其外部作用域已经不再执行。闭包通常涉及自由变量,即在函数内部使用的,既不是函数参数也不是函数局部...

Global site tag (gtag.js) - Google Analytics