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

java object to lua 脚本

    博客分类:
  • java
阅读更多
需要把wordFilter去掉,这个类用来把java对象转换为lua的table和字符串。
用于动态生成lua脚本的时候使用
可以弄到el函数里面,著名原作者,而且请注意,对象循环引用我没处理!!!!!
java Lua encoder 
import java.io.IOException;
import java.sql.Time;
import java.util.Collection;
import java.util.Date;

import net.sf.cglib.beans.BeanMap;
import vlan.core.web.WordFilter;
import vlan.util.DateUtils;


/**
 * lua的编码器,编码成lua脚本
 * @author zuoge85
 *
 */

public class LuaEncoder {
	public static final String encodeObject(Object o){
		StringBuilder sb=new StringBuilder();
		try {
			encodeObject(sb,o);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return sb.toString();
	}
	@SuppressWarnings("unchecked")
	public static final void encodeObject(Appendable sb,Object o) throws IOException{
		if(o==null){
			sb.append("nil");
		}else if(o instanceof Integer){
			sb.append(String.valueOf(o));
		}else if(o instanceof CharSequence){
			sb.append('L');
			sb.append('\"');
			encode(sb,(CharSequence)o);
			sb.append('\"');
		}else if(o instanceof Byte){
			sb.append(String.valueOf(o));
		}else if(o instanceof Short){
			sb.append(String.valueOf(o));
		}else if(o instanceof Float){
			sb.append(String.valueOf(o));
		}else if(o instanceof Boolean){
			sb.append(String.valueOf(o));
		}else if(o instanceof java.sql.Date){
			sb.append('L');
			sb.append('\"');
			encode(sb, DateUtils.format((java.sql.Date)o));
			sb.append('\"');
		}else if(o instanceof Time){
			sb.append('L');
			sb.append('\"');
			encode(sb, DateUtils.format((Time)o));
			sb.append('\"');
		}else if(o instanceof Date){
			sb.append('L');
			sb.append('\"');
			encode(sb, DateUtils.format((Date)o));
			sb.append('\"');
		}else if(o instanceof Table){
			Table e=(Table)o;
			e.toString(sb);
		}else if(o instanceof Collection){
			sb.append('{');
			boolean isd=false;
			for(Object item:(Collection)o){
				if(isd){
					sb.append(',');
				}else{
					isd=true;
				}
				encodeObject(sb,item);
			}
			sb.append('}');
		}else if(o.getClass()==Object.class){
			sb.append("{}");
		}else if(o instanceof Number){//google的list实现了这个接口的貌似,因此放最后
			/**
			 * 太长了的数字当成字符串处理
			 */
			sb.append('\"');
			encode(sb, String.valueOf(o));
			sb.append('\"');
		}else{
			//反射对象
			BeanMap m=BeanMap.create(o);
			sb.append('{');
			boolean isd=false;
			for(Object key:m.keySet()){
				if(isd){
					sb.append(',');
				}else{
					isd=true;
				}
				Object value=m.get(key);
				sb.append((String)key);
				sb.append('=');
				encodeObject(sb,value);
			}
			sb.append('}');
		}
	}
	public static final String encode(String str){
		StringBuilder sb=new StringBuilder();
		try {
			encode(sb,str);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return sb.toString();
	}
	public static final void encode(Appendable out,CharSequence str) throws IOException {
		if (str == null) {
            return ;
        }
		if(wordFilter!=null){
			str=wordFilter.out(str);
		}
        int sz;
        sz = str.length();
        for (int i = 0; i < sz; i++) {
            char ch = str.charAt(i);
            if (ch < 32) {
                switch (ch) {
                    case '\b' :
                        out.append('\\');
                        out.append('b');
                        break;
                    case '\n' :
                        out.append('\\');
                        out.append('n');
                        break;
                    case '\t' :
                        out.append('\\');
                        out.append('t');
                        break;
                    case '\f' :
                        out.append('\\');
                        out.append('f');
                        break;
                    case '\r' :
                        out.append('\\');
                        out.append('r');
                        break;
                    default :
                    	out.append(ch);
                        break;
                }
            } else {
                switch (ch) {
                    case '\'' :
                        out.append('\\');
                        out.append('\'');
                        break;
                    case '"' :
                        out.append('\\');
                        out.append('"');
                        break;
                    case '\\' :
                        out.append('\\');
                        out.append('\\');
                        break;
                    case '/' :
                        out.append('\\');
                        out.append('/');
                        break;
                    default :
                        out.append(ch);
                        break;
                }
            }
        }
    }
	private static WordFilter wordFilter;
	/**
	 * 过滤,注意框架会自动设置这个属性,如果ioc工程能获取WordFilter类型的实例
	 * @param wordFilter
	 */
	public static void setWordFilter(WordFilter wordFilter) {
		LuaEncoder.wordFilter = wordFilter;
	}
}
 

 

1
1
分享到:
评论

相关推荐

    SpringBoot+Redis执行lua脚本的方法步骤

    * 在 Java 代码中,使用 `DefaultRedisScript` 执行 Lua 脚本: ```java @Autowired private StringRedisTemplate redisTemplate; @Test public void contextLoads() { String lockKey = "123"; String ...

    SpringBoot通过RedisTemplate执行Lua脚本的方法步骤

    SpringBoot 通过 RedisTemplate 执行 Lua 脚本的方法步骤 Spring Boot 是一个基于 Java 的框架,用于构建企业级应用程序,而 Redis 是一个基于内存的 NoSQL 数据库,常用于缓存、消息队列和数据存储。Lua 脚本是 ...

    luajava.zip

    2. 加载Lua脚本:使用`state.LdoFile("path_to_your_lua_script.lua");`加载并执行Lua脚本文件。 3. 调用Lua函数:在Lua脚本中定义函数后,可以通过`state.getFunction("lua_function_name");`获取该函数,然后通过...

    LuajavaDemo

    本文将详细介绍如何在Android应用中使用Luajava库进行Lua脚本的调用,并通过"LuajavaDemo"这个实例项目,深入解析其实现原理和应用技巧。 一、Luajava库简介 Luajava是Lua与Java交互的一个桥梁,它允许Lua代码直接...

    LuaJava在Android平台的动态链接库文件

    LuaJava库允许开发者编写Lua脚本,并在Android应用中调用Java类和方法,反之亦然。这为混合式开发提供了便利,使得开发者可以在不离开Java主框架的同时,利用Lua进行快速原型设计或者处理性能关键的部分。 在压缩包...

    SpringBoot-redis-lua

    1. **Lua脚本优点**: Lua脚本在Redis中执行是原子性的,能确保在并发环境下数据的一致性。此外,通过减少网络往返,提高了数据操作的效率。 2. **`EVAL`命令**: Redis提供了`EVAL`命令来执行Lua脚本。Lua脚本作为...

    json转lua-table工具

    JSON(JavaScript Object Notation)和Lua Table 是两种广泛使用的数据序列化格式,分别在Web开发和游戏编程领域中占据重要地位。JSON因其简洁明了的结构而被广泛用于数据交换,而Lua Table则是Lua编程语言中的核心...

    Android与Lua互调的全注释简易Demo

    在Android平台上,有时候为了实现...通过 Luaj 库,我们可以轻松地在Android应用中嵌入Lua脚本,实现动态逻辑处理,降低开发复杂度。记住,安全总是首要考虑的因素,因此确保在允许Lua代码执行时采取适当的防护措施。

    Lua面向对象封装

    在IT行业中,Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统以及服务器配置等场景。在本文中,我们将深入探讨“Lua面向对象封装”这一主题,结合给定的文件名“CC_Object.lua”和“Luatest1.lua”,推测这...

    lua 源代码 添加了 cJson

    在这个“lua 源代码 添加了 cJson”的项目中,开发者整合了Luaj,一个允许Java应用程序运行Lua脚本的库,与cJson,一个高效的C语言实现的JSON解析器和序列化器。这样的结合对于Android应用尤其有用,因为它可以在...

    Lua in Android

    这些库提供了将Lua与Android原生API交互的桥梁,使得Lua脚本能够访问和控制Android系统服务、处理UI事件、存储数据等。 2. **Lua脚本** Lua语法简单,支持基本的数据类型(如数字、字符串、布尔值、表、nil和函数...

    redis实现分布式锁,自旋式加锁,lua原子性解锁

    在Java代码中,可以调用`EVAL`命令执行这个lua脚本,确保解锁操作的原子性: ```java public void unlock(String key, String lockValue) { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then\n" +...

    android ndk lua5.1.5 (加入了lua_cjson)

    这使得你的应用不仅能执行Lua脚本,还能处理复杂的JSON数据,极大地增强了应用的灵活性和可扩展性。在实际开发中,你还可以根据需求进一步定制lua_cjson,或者扩展其他lua库,以满足特定场景的需求。

    Lua cjson库

    在Windows平台上,你需要将这个库文件放置在你的Lua搜索路径中,或者与你的Lua脚本在同一目录下,以便lua能够找到并加载cjson库。 总的来说,Lua cjson库是Lua开发者处理JSON数据的必备工具,它简化了JSON和Lua数据...

    win lua 读写 xlsx 依赖的 luacom.dll

    Luacom.dll是Lua与COM(Component Object Model)接口交互的桥梁,允许Lua脚本调用Windows系统中的Office组件,例如Microsoft Excel,来实现对xlsx文件的读取和写入。 Luacom是一个由Lua社区开发的开源库,它提供了...

    Lua解析器mLua.zip

    介绍当下多数在java下执行lua脚本的程序都是用了luajava。然而luajava存在一些严重的问题,它会将byte数组和string等同对待,而且它的反射执行效率比较低。为了弥补这些问题,我参考luajava,重写了它的java和jni...

    java操作redis所需jar

    10. **Lua脚本**:Redis支持在服务器端执行Lua脚本,这可以用于执行一连串操作,保证原子性。 ```java String script = "return redis.call('incr', KEYS[1])"; Long result = jedis.eval(script, Collections....

    java连接linux环境中的redis

    8. **脚本操作**:Redis支持Lua脚本,Jedis的`eval`和`evalsha`方法可以执行Lua脚本。 9. **连接断开与关闭**:在应用结束时,记得关闭连接池: ```java jedisPool.close(); ``` 10. **异常处理**:在进行Redis...

    jedis(java连接redis)

    3. **脚本操作**:使用Lua脚本在服务器端执行复杂逻辑。 ```java String script = "return redis.call('get', KEYS[1])"; String value = jedis.eval(script, Collections.singletonList("key"), Collections....

    java-Redis操作

    - **脚本执行(Lua Scripting)**:Jedis允许通过`scriptLoad`和`eval`执行Lua脚本,实现复杂的原子操作。 4. **连接关闭与资源释放**: - 在完成Redis操作后,记得关闭连接,释放资源。对于单个连接,使用`jedis....

Global site tag (gtag.js) - Google Analytics