个人笔记
一、大概用法
1、参数构造
也可以用来主动调用动态方法, 也可以用最底下的rpc实现
Java.choose('com.dta.mysecondapplication.MainActivity',{
onMatch: function (instance){
var result = instance.add(1,2)
console.log("result is ===>"+result)
},
onComplete: function () {
}
})
2、打印字符串
Java.use('java.lang.Character').toString.overload('char').implementation = function (x) {
console.log("Character.toString arg ===>",x)
var result = this.toString(x)
console.log("Character.toString.Result ===>", result)
return result
}
3、打印数组
[C是JNI的方法签名, https://www.jianshu.com/p/8783d4c9fa52,Java.array转换为指定类型的数组
Java.use('java.util.Arrays').toString.overload('[C').implementation = function (x) {
console.log("Arrays.toString arg ===>",JSON.stringify(x))
// const values = Java.array('char', [ '1', '2', '3' ]);
var result = this.toString(x)
console.log("Arrays.toString.Result ===>", result)
return result
}
4、强制转换
var WaterClass = Java.use('com.dta.mysecondapplication.Water')
var WaterHandle = WaterClass.$new()
var Juice = WaterHandle.getInstance()
Juice = Java.cast(Juice, Java.use('com.dta.mysecondapplication.Juice'))
Juice.fillEnergy()
5、创建新类
并不是一创建好就可以加载进去的。有关于classloader的加载,需要去看课件,最下面会贴出实战的代码例子
var LiquidClass = Java.use('com.dta.mysecondapplication.liquid')
var BeerClass = Java.registerClass({
name: "com.dta.mysecondapplication.Beer",
implements: [LiquidClass],
methods: {
flow: function () {
console.log("This beer's flow is called")
return ""
},
add: {
returnType: 'int',
argumentTypes: ['int', 'int'],
implementation(a, b) {
console.log(a+b);
return a+b;
}
}
}
})
// BeerClass.$new().flow()
BeerClass.$new().add(1,2)
6、枚举打印
var Signal = Java.use('com.dta.mysecondapplication.Signal')
var TrafficLightClass = Java.use('com.dta.mysecondapplication.TrafficLight')
var TrafficHandle = TrafficLightClass.$new()
TrafficHandle.color.value = Signal.YELLOW.value
TrafficHandle.main()
7、Map打印
JAVA怎么打印这里就怎么打印(Set也是类似原理打印)
Java.use('com.dta.mysecondapplication.MainActivity')