`

Fake Code easy implements

    博客分类:
  • JDK
 
阅读更多
package org.miniframe.modules.utils;

import java.util.HashMap;
import java.util.Map;

import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 

public class FakeCode {
	
	private static final ScriptEngineManager sem = new ScriptEngineManager();
	private static final ScriptEngine engine = sem.getEngineByName("groovy");
	private Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
	private static boolean cacheFlag = true;
	private static Map<String,Object> cacheMap = new HashMap<String,Object>();
	
	public FakeCode(){
		bindings.put("tag", new TagImpl());
	}
	
	/**
	 * call fake code with parameter map
	 * 
	 * same expression and params will be cache next time call
	 * 
	 * @param expression
	 * @param params
	 * @return
	 */
	public Object eval(String expression,Map<String,Object> params){
		CacheKey ck = new CacheKey(expression,params);
		Object obj = cacheMap.get(ck.getKey());
		if(obj!=null){
			return obj;
		}else{
			try {
				if(params.containsKey("tag")){
					throw new RuntimeException("you can't override system key");
				}
				bindings.putAll(params);
				obj = engine.eval(expression);
			} catch (ScriptException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if(cacheFlag){
				cacheMap.put(ck.getKey(), obj);
			}
		} 
		return obj;
	}
	
	/**
	 * call fake code with parameter index
	 * 
	 * same expression and params will be cache next time call
	 * 
	 * @param expression
	 * @param args
	 * @return
	 */
	public Object eval(String expression,Object...args){
		CacheKey ck = new CacheKey(expression,args);
		Object obj = cacheMap.get(ck.getKey());
		if(obj!=null){
			return obj;
		}else{
			try {
				obj = engine.eval(String.format(expression,args));
			} catch (ScriptException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if(cacheFlag){
				cacheMap.put(ck.getKey(), obj);
			}
		} 
		return obj;
	}
	
	public void addBuinding(String key, Object value){
		bindings.put(key, value);
	}
	
	class CacheKey{
		String expression;
		Object[] args = new Object[0];
		Map<String,Object> params = new HashMap<String,Object>();
		public CacheKey(String expression,Object...args){
			this.expression=expression;
			this.args=args;
		}
		public CacheKey(String expression,Map<String,Object> params){
			this.expression=expression;
			this.params=params;
		}
		  
		public String getKey(){
			StringBuffer sb = new StringBuffer(expression); 
			for(Object arg:args){
				sb.append(arg);
			}
			for(Map.Entry<String, Object> entry:params.entrySet()){
				sb.append(entry.getKey()).append(entry.getValue());
			}
			return sb.toString();
		}
		
	}
	
	class TagImpl{
		
		/**
		 * judge user account has Tag 
		 * 
		 * @param account
		 * @return
		 */
		public boolean hasTag(int account){ 
			boolean result= account%2==0;
			//... judge this account has Tag.
			return result;
		}
		
		/**
		 * judge user account is manager
		 * 
		 * @param account
		 * @return
		 */
		public boolean isManager(int account){
			boolean result= account%2!=0;
			//... judge this account has Tag.
			return result;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FakeCode fc = new FakeCode();
		System.out.println(fc.eval("tag.hasTag(%1$s)",10));
		System.out.println(fc.eval("tag.hasTag(%1$s)",9));
		System.out.println(fc.eval("tag.isManager(%1$s)",10));
		System.out.println(fc.eval("tag.isManager(%1$s)",10));
		System.out.println(fc.eval("tag.isManager(%1$s)",9));
		System.out.println(fc.eval("tag.isManager(%1$s)&&tag.hasTag(%1$s)",9));
		System.out.println(fc.eval("tag.isManager(%1$s)&&tag.hasTag(%2$s)",9,10));
		//may be you will feel that i don't want to define %1$s, i can't remember the index.
		
		Map<String,Object> params = new HashMap<String,Object>();
		params.put("account", 10);
		System.out.println(fc.eval("tag.hasTag(account)",params));
		System.out.println(fc.eval("tag.hasTag(account)",params)); 
	}

}

分享到:
评论

相关推荐

    json fake_useragent fake_useragent

    fake_useragent json缓存 爬虫 fake 消息头

    Fake Location(com.lerist.fakelocation).bak

    Fake Location(com.lerist.fakelocation).bak

    fake_useragent.zip

    在Python编程中,Fake UserAgent库是一个非常实用的工具,它允许开发者生成逼真的用户代理字符串,以模拟不同浏览器或设备访问网站。这个工具的主要作用是帮助开发人员在进行网络爬虫或者自动化测试时,避免被目标...

    Fake Location + Vmos虚拟机

    Fake Location + Vmos虚拟机 + 步道乐跑(钉钉),《Fake Location [1] 》是一款位置模拟软件,可以通过root环境对手机所处的位置进行模拟,同时支持模拟时的移动。Vmos虚拟机的作用是能够获取root权限,步道乐跑等...

    无需注册可用的fakelocation

    APK文件包含了应用的所有组件,包括代码、资源、资产和证书,用户可以通过安装这个文件来使用Fakelocation应用。 关于"Fakelocation"这款应用的具体功能,我们可以推测它可能具有以下特点: 1. 定位模拟:用户可以...

    fake location.apk

    Fake Location是一款很有趣的虚拟位置应用,玩过的人也应该都是知道的,可以直接实现位置的模拟,需要root权限,因为这样不容易被检测到,让模拟的成功概率更加的高,支持多级的移动速度,而且也很适合游戏的场景,...

    修改以后的Fake菜单

    "修改以后的Fake菜单"是一个这样的实例,它源于Codefan网站上的一份源代码,经过修改后,实现了与系统菜单的绑定功能。这个控件的创新之处在于它能够集成到系统的菜单体系中,使得应用的交互更加自然。 首先,我们...

    Fake GPS 安装包

    FAKE GPS ======== Copyright(c) 2005 Microsoft Corporation Fake GPS enables developers to receive data using the GPS APIs even if there is no GPS receiver on the device. The GPS data is read from ...

    fake2db创建自定义测试数据库填充假数据

    `fake2db`是一个Python库,专门用于创建自定义的测试数据库并填充伪造数据,这样可以有效地模拟真实环境而不引入实际数据的风险。本文将详细介绍`fake2db`的使用方法、功能特点以及如何将其整合到你的测试流程中。 ...

    Laravel开发-fake-better

    `Laravel开发-fake-better`项目正是为了解决这个问题,它提供了一个更先进的仿冒(fake)数据生成器,使开发者能够快速创建出更贴近实际的数据,提升测试的准确性和效率。 在Laravel的默认情况下,`...

    前端开源库-fake-fetch

    在前端开发中,"fake-fetch" 是一个非常实用的开源库,主要用来模拟 `fetch` API,以便在测试环境中进行数据获取和交互。`fetch` 是现代 Web 开发中的一个核心部分,它允许开发者向服务器发起异步请求,获取或发送...

    fake_useragent.json

    fake_useragent 本地文件,版本为 0.1.11。FakeUserAgentError('Maximum amount of retries reached') 彻底解决办法中,fake_useragent.json 文件需要从 herokuapp 下载。为无法打开 herokuapp 网站的朋友提供下载。

    fake call 汉化版

    Fake Call v1.1 CAB汉化版 【软件类型】手机软件 【支持平台】基于ARM架构的所有 Windows Mobile 5.0 以上设备 【测试平台】Dopod900+繁体Windows Mobile 6.1 【软件大小】234K,安装后占用347K空间 【软件简介】...

    HaCreator_fake_FakeIt_

    【标题】"HaCreator_fake_FakeIt_" 暗示我们正在探讨一个与软件伪造或模拟有关的主题,可能是一个用于测试或开发目的的工具。"FakeIt" 往往指的是在编程领域中的一种模拟框架,它允许开发者创建模拟对象来代替真实的...

    iFake的安装包,修改location

    iFake的安装包,修改location

    UA.rar fake_useragent解决报错文件

    fake_useragent_0.1.11.json

    FakeLocation虚拟定位软件使用教程及安装包

    一、产品概述 随着地图应用的日益广泛,用户对于虚拟定位软件的需求也越来越迫切。虚拟定位软件是一种利用计算机技术、地理信息系统和全球定位系统等技术手段,对用户进行定位并显示其位置的软件。...

    kinect2_fake_laser

    之后启动:roslaunch [路径] turtlebot_fake_laser_openni2_v2.launch 2、安装 ros by example(indigo) 的例程: sudo apt-get install ros-indigo-turtlebot-bringup \ ros-indigo-turtlebot-create-desktop ros-...

    一个 Fake Wifi 攻击方案.zip

    Fake WiFi攻击方案是一种网络安全威胁,通常利用恶意Wi-Fi接入点欺骗用户,以获取敏感信息或在不知情的情况下将用户引导到钓鱼网站。这个名为“wifiphisher-master”的开源项目,旨在提供一个易于使用的工具,让安全...

    Fake Ninja 2.7 by Spirit

    花指令\Fake Ninja 2.7 by Spirit.exe

Global site tag (gtag.js) - Google Analytics