当前位置: 首页 > news >正文

新开传奇网站刚开企业网站代维护

新开传奇网站刚开,企业网站代维护,企业网站设计文档,网站建设论文答辩ppt最近在学习lua#xff0c;然后顺便看了下luaj#xff0c;可能用的人比较少#xff0c;网上关于luaj的文章较少#xff0c;其中在网上找到这个博主的相关文章#xff0c;很详细#xff0c;对于要学习luaj的小伙伴可以两篇一起查看#xff0c;本文在此基础上进行扩展。 …     最近在学习lua然后顺便看了下luaj可能用的人比较少网上关于luaj的文章较少其中在网上找到这个博主的相关文章很详细对于要学习luaj的小伙伴可以两篇一起查看本文在此基础上进行扩展。      本文的luaj版本是luaj-3.0.1 珠玉在前》》》》Luaj学习笔记(二) - 在Lua中操作Java对象 LuaJ源码中org.luaj.vm2.lib.jse.LuajavaLib是我们在lua中操作java的主要方法库定义。 luajava有五种方法让我们操作java类bindClas 、 newInstance 、 new 、 createProxy 、 loadLib 先放上源码然后我们一步步解析bindClas 、 newInstance 、 new 使用方案和案例在前一篇文章就已经解释过了这里不做过多赘述对于前篇不详细的createProxy和loadLib做重点介绍 public Varargs invoke(Varargs args) {try {switch ( opcode ) {case INIT: {// LuaValue modname args.arg1();LuaValue env args.arg(2);LuaTable t new LuaTable();bind( t, this.getClass(), NAMES, BINDCLASS );env.set(luajava, t);env.get(package).get(loaded).set(luajava, t);return t;}case BINDCLASS: {final Class clazz classForName(args.checkjstring(1));return JavaClass.forClass(clazz);}case NEWINSTANCE:case NEW: {// get constructorfinal LuaValue c args.checkvalue(1); final Class clazz (opcodeNEWINSTANCE? classForName(c.tojstring()): (Class) c.checkuserdata(Class.class));final Varargs consargs args.subargs(2);return JavaClass.forClass(clazz).getConstructor().invoke(consargs);}case CREATEPROXY: { final int niface args.narg()-1;if ( niface 0 )throw new LuaError(no interfaces);final LuaValue lobj args.checktable(niface1);// get the interfacesfinal Class[] ifaces new Class[niface];for ( int i0; iniface; i ) ifaces[i] classForName(args.checkjstring(i1));// create the invocation handlerInvocationHandler handler new ProxyInvocationHandler(lobj);// create the proxy objectObject proxy Proxy.newProxyInstance(getClass().getClassLoader(), ifaces, handler);// return the proxyreturn LuaValue.userdataOf( proxy );}case LOADLIB: {// get constructorString classname args.checkjstring(1);String methodname args.checkjstring(2);Class clazz classForName(classname);Method method clazz.getMethod(methodname, new Class[] {});Object result method.invoke(clazz, new Object[] {});if ( result instanceof LuaValue ) {return (LuaValue) result;} else {return NIL;}}default:throw new LuaError(not yet supported: this);}} catch (LuaError e) {throw e;} catch (InvocationTargetException ite) {throw new LuaError(ite.getTargetException());} catch (Exception e) {throw new LuaError(e);}}bindclass bindclass:返回一个JavaClass的类该类是对我们参数指定的java类的一个包装。bindClass方法返回类实例class同时可以调用类实例的new方法生成该class的实例object然后就可以调用实例方法实例化的调用这一点和学lua时的面向对象的写法很相似 该方法适合调用java类的静态方法和静态属性当然也可以用来实例化对象但newInstance 和 new更符合语义 源码 case BINDCLASS: {final Class clazz classForName(args.checkjstring(1));return JavaClass.forClass(clazz);}JavaClassstatic final LuaValue NEW valueOf(new);static JavaClass forClass(Class var0) {JavaClass var1 (JavaClass)classes.get(var0);if (var1 null) {classes.put(var0, var1 new JavaClass(var0));}return var1;}public LuaValue getConstructor() {return this.getMethod(NEW);}测试java代码 public class TestClass {public String s1;protected String s2;private String s3;public static String s4;public String method001(){ return method001; }protected void method002(){ }private void method003(){ }public static String method004(){ return method004; } }lua脚本 local className com.test.luaj.TestClasslocal classx luajava.bindClass(className) print(静态方法调用,classx:method004()) print(静态属性值,classx.s4)local obj classx:new() print(实例方法调用,obj:method001()) print(实例属性值,obj.s1)输出结果 静态方法调用 method004 静态属性值 s4 实例方法调用 method001 实例方法调用 s1其中我们在lua脚本中用类实例调用:new()方法时实际是invoke JavaClass的new方法而这个new方法通过getMethod方法拿到的是他的构造器方法在下一个方法源码中 newInstance || new 通过源码可以看到 newInstance 和 new方法的大部分逻辑是一致的 入参是有区别的: newInstance 方法接受一个字符串的类路径然后转换为Class实例;new方法接受一个LuaValue对象,从中拿出userdata数据而这个userdata数据是一个Class实例。 而上一个方法bindClass返回的就是一个包装了Class的LuaValue对象因此我们可知在使用new方法的时候需要先用bindClass方法生成一个Class实例出来而newInstance就不用了 然后代码对我们在lua中传入的参数截取后边的一段用作构造器参数然后调用我们在上一个方法看到JavaClass.forClass包装Class实例然后获取该类的构造器然后invoke调用构造器方法生成对象。 源码 case NEWINSTANCE:case NEW: {// get constructorfinal LuaValue c args.checkvalue(1); final Class clazz (opcodeNEWINSTANCE? classForName(c.tojstring()): (Class) c.checkuserdata(Class.class));final Varargs consargs args.subargs(2);return JavaClass.forClass(clazz).getConstructor().invoke(consargs);}JavaClasspublic LuaValue getConstructor() {return getMethod(NEW);}LuaValue getMethod(LuaValue key) { ···Map map new HashMap();Constructor[] c ((Class)m_instance).getConstructors();List list new ArrayList();for ( int i0; ic.length; i ) if ( Modifier.isPublic(c[i].getModifiers()) )list.add( JavaConstructor.forConstructor(c[i]) );switch ( list.size() ) {case 0: break;case 1: map.put(NEW, list.get(0)); break;default: map.put(NEW, JavaConstructor.forConstructors( (JavaConstructor[])list.toArray(new JavaConstructor[list.size()]) ) ); break;} ··· } 测试代码 local className com.test.luaj.TestClasslocal classx luajava.bindClass(className) local obj luajava.new(classx) print(实例方法调用,obj:method001()) print(实例属性值,obj.s1) print(-----------)local obj2 luajava.newInstance(className) print(newInstance实例方法调用,obj2:method001()) print(newInstance实例属性值,obj2.s1)输出结果 new实例方法调用 method001 new实例属性值 s1 ----------- newInstance实例方法调用 method001 newInstance实例属性值 s1createProxy createProxy可以像JDKProxy那样的在lua中创建对一个对象的一个或多个方法的代理        事实上createProxy使用的代理就是JDKProxy只不过在用法上和我们通常的用法有些许变动在最终的方法的invoke时并不是通常的使用JAVA反射中的的Method的invoke,而是Luaj自己LuaValue的invoke,也就是说通过调用在lua脚本中定义的那个扩展方法去实现代理实际上的代理逻辑都在lua中定义下面lua脚本可以看出来        还有很重要的一点在lua中通过createproxy生成出来的代理对象是不能在lua脚本中去直接调用代理对象的方法的只能通过将该代理对象当做参数通过调用类方法或者对象方法之后在java中去触发代理对象的方法。看下边的测试lua源码 源码 case CREATEPROXY: { final int niface args.narg()-1;if ( niface 0 )throw new LuaError(no interfaces);final LuaValue lobj args.checktable(niface1);// get the interfacesfinal Class[] ifaces new Class[niface];for ( int i0; iniface; i ) ifaces[i] classForName(args.checkjstring(i1));// create the invocation handlerInvocationHandler handler new ProxyInvocationHandler(lobj);// create the proxy objectObject proxy Proxy.newProxyInstance(getClass().getClassLoader(), ifaces, handler);// return the proxyreturn LuaValue.userdataOf( proxy );} 测试java代码 public interface Car {void running(String carName);void blow(Integer num);} ------------------------------------------------- public class Taxi implements Car {Overridepublic void running(String carName) {System.out.println(The taxi[carName] is running.);}Overridepublic void blow(Integer num) {for (int i 0; i num; i) {System.out.print(didi\n);}System.out.print();}public static void triggerProxy(Car car){String carName UUID.randomUUID().toString();car.running(carName);System.out.println(--------);car.blow((int)Math.random()*101);}} -----------------------------------------------------public class LuaJCreateProxyTest {public static void main(String[] args) throws ScriptException {createProxy002();}static void createProxy002() throws ScriptException {Globals globals JsePlatform.standardGlobals();globals.loadfile(res/lua/createProxyTest02.lua).call();} }lua脚本 interfaceName com.test.luaj.CarclassName com.test.luaj.Taxitaxi luajava.newInstance(className)-- InvocationHandlerlocal exit_cb {running function (carname)print(这是对Car的代理逻辑----前)taxi:running(carname)print(这是对Car的代理逻辑----后)end,blow function(num)print(Car--blow----前)taxi:blow(num)print(Car--blow----后)end}proxyObj luajava.createProxy(interfaceName ,exit_cb)-- proxyObj.running() -- 会报错不能这样使用--必须通过传参给java方法在java代码中去调用代理对象的方法luajava.bindClass(className):triggerProxy(proxyObj)输出结果 这是对Car的代理逻辑----前 The taxi[74f253d1-c0d8-47ea-9799-01401174abe4] is running. 这是对Car的代理逻辑----后 -------- Car--blow----前 didi Car--blow----后loadLib 关于loadLib这个方法前边文章可能由于历史更新的原因在luaj-3.0.1版本中代码是不对的      loadLib通过源码查看我我们其实可以看到他只用两个参数第一个是类路径第二个是静态方法名这个方法要么返回一个LuaValue类型的结果要么不返回或者其他返回类型都会被loadLib转为nil。 源码 case LOADLIB: {// get constructorString classname args.checkjstring(1);String methodname args.checkjstring(2);Class clazz classForName(classname);Method method clazz.getMethod(methodname, new Class[] {});Object result method.invoke(clazz, new Object[] {});if ( result instanceof LuaValue ) {return (LuaValue) result;} else {return NIL;}}测试java源码 public static LuaInteger xxx() throws ScriptException {System.out.println(xxx执行啦\t(int)Math.pow(14,2));return LuaValue.valueOf((int)Math.pow(14,2));}static void test007() throws ScriptException {Globals globals JsePlatform.standardGlobals();globals.loadfile(res/lua/loadLibTest.lua).call();}lua脚本 local className com.yangsong.luaj.LuaJTest local method xxx local _, result luajava.loadLib(className, method) print(_,result)输出结果 xxx执行啦 196 nil总结 bindClass适合做类的静态方法和静态属性的取值的操作也是使用new方法的前置操作。 newInstance和new适合用作java对象实例化之后对实例对象的操作和取值 createProxy适合用作JDKProxy的替代用法需要注意的是在被代理对象和代理对象都在脚本中生成且代理对象不能直接在lua中去调用代理方法执行需要以传参的形式给到java方法调用java方法触发。 loadLib用于类的无参静态方法的调用如果需要返回值则需要定义方法返回类型为LuaValue
http://www.dnsts.com.cn/news/63218.html

相关文章:

  • 做网站的版权问题城市建设的网站 政策法规
  • 互联网创意网站有哪些做网站的工资
  • 网站建设大致分哪几个板块深圳建站公司开发费用
  • 济南网站优化技术厂家电商网站设计欣赏
  • 微商网站怎么做旅游网站制作分析
  • 唯品会 只做特卖的网站什么是网络营销例子
  • html怎么做网站背景上饶公司做网站
  • 无锡点个赞建站郑州百度网站快速优化
  • 高职两学一做专题网站外包加工网怎么样
  • 网站 动态 标签页市场营销考研可以考哪些专业
  • 国际交流合作网站建设方案十堰h5响应式网站
  • 京东pc网站用什么做的而的跟地seo排名点击软件
  • 网站开发到上线 多久最新网域查询入口
  • 网站开发的规格描述推广效果好的有哪些
  • 网站建设技术的实现python写网页
  • 新沂网站建设无锡崇安网站建设
  • 做网站相关人员贵州有哪些公司做网站做得好
  • 电商网站服务排名seo是啥职位
  • 百度做网站的特点行业网站建设蓝云
  • 消费返利系统网站建设wordpress微信查看密码破解
  • 扬中网站建设公司wordpress用户推广
  • 建网站公司 优帮云如何提高网站点击率
  • 网站系统建设系广告经营者wordpress旧编辑器
  • 广州建网站新科网站建设网站建设服务费开票
  • 搜索网站哪个好互联网营销模式
  • 北京做网站个人wordpress 5编辑器使用教程
  • 河南省建设协会网站基础网络建设方案
  • 做餐厅网站的需求分析苏州seo招聘
  • 网站建设大作业跨境电商哪个平台比较好
  • 合肥建立网站小红书推广引流软件