vtrayy

Results 8 comments of vtrayy

shizuku.isRunning()或者shizuku.running。

感谢回复,我有个疑问,没理解错的话,setAndNotify是一个java方法,传入js对象时get到的是js对象,这说明Rhino自动把js对象映射成java对象后入参,get时再把java对象映射回js对象(否则得到的应该是java Map之类的结构),这是双向的;但是如果传入js基本类型,如number,映射到java Double,get到的是仍是java Double,这是单向的。这是Rhino的设计还是autojs的问题?另外setAndNotify(3) 时get到的仍是3,而不是3.0,下面的示例却是3.0,这怎么回事? ``` var sb = new java.lang.StringBuffer(); sb.append("hi, mom"); sb.append(3); // this will add "3.0" to the buffer since all JS numbers are doubles by default...

看了几遍,没理解错的话,Scriptable 可以看成一个特殊的桥接对象,既是java对象也是“原生js对象”,所有的js对象都是java对象,所以入参时不用转换,get到的没变,本质仍是java对象,但又可以当做原生js对象使用。这样又有个疑问,那为什么不设计一个既是java 包装类又是“js 基本类型”的桥接对象,这样可以避免入参时装箱,返回时看设置决定是否拆箱的情况,是因为js基本类型不是对象难以桥接吗? 最后的测试没看懂,new java.lang.Double(1) 是一个java对象,Context.toString怎么按照 JavaScript number 接受参数,如果拼接的是别的java对象,如 console.log(1 + ": " + new java.io.File("/sdcard")); 又怎么处理,是不是Context.toString对这些数值型的java对象做了特殊处理?

看懂了,感谢作者的慷慨指导。作者好厉害,平时是怎么学习的,直接读源码对我来说还是太困难了,numberToString 只能读懂到 if (d == 0.0) return "0" 这一行,DToA.JS_dtobasestr(base, d) 点进去勉强读懂,FastDtoa.numberToString(d)层层封装已经读不懂了(也不知道 按ECMAScript 规范生成 "最短且可还原" 的十进制字符串)

我也支持isJavaPrimitiveWrap设置为false的做法,从开发的角度思考,当我在js里使用java包装类的时候,只有两种情况,一是使用类里的方法,二是传参,在使用valueOf之类的方法创建包装类时,由于isJavaPrimitiveWrap设置为false,实际仍为js类型,运行脚本会报错没有这个方法,这时我会立刻知道包装类没创建成功,从而尝试使用new之类的方式创建,而原来的隐形转换不仅反常识(输入一个js基本类型得到一个java对象)还有隐形的坑,如开头的示例,let b = a.blockedGet() 如果是一个false的java 包装类,在js 用if (b)判断恒为真,开发者很难会这样写 if (b===true),直接打印b也是false,开始怀疑人生。原作者单独对 String 做了转换,猜测是因为string高频使用,不然js里大把java.lang.String难以理解。

就是String 做了 JavaScript 原始化处理才加深了思维惯性,作为js开发者的时候,传入js对象得到js对象符合逻辑,传入string得到的也是string也符合逻辑,这两个都是高频使用的类型,当有一天传入别的js基本类型根本不会意识到问题,即使有一定的java基础也不会想到装箱、拆箱,因为对Rhino的运行并不了解以及之前的思维惯性只会认为传入什么得到什么。

> [@vtrayy](https://github.com/vtrayy) [@aiselp](https://github.com/aiselp) 我在想是否可以在 Auto.js 应用的设置页面增加一个 `isJavaPrimitiveWrap` 相关的选项开关, 同时支持脚本控制 (如 `runtime.setJavaPrimitiveWrap(false)`), 优先级大于设置页面的开关. 这样的话开发者可以根据偏好自行控制原始值包装策略. 这个可以