autojs-create-javaarray
Version:
Autojs Pro V9的创建Java类型数组。
234 lines (205 loc) • 8.23 kB
JavaScript
"nodejs";
import { install } from "rhino";
install();
class JavaArray {
#java_types = {
"boolean": "Boolean",
"int": "Integer",
"long": "Long",
"double": "Double",
"char": "Character",
"byte": "Byte",
"float": "Float"
};
#js_types = {
"string": "String",
"number": "Integer",
"boolean": "Boolean"
}
findClassOrNull(str) {
return $autojs.java.findClassOrNull(str);
}
isInteger(n) {
return parseInt(n) == parseFloat(n)
}
multiarrType(arr){
let types = this.#java_types;
if(arr[0] instanceof Array){
return this.multiarrType(arr[0]);
}
if(arr[0]&&arr[0]["getClass"] && arr[0].getClass().isArray()){
if(arr[0]){
return this.multiarrType(arr[0])
}
}else if(arr&&arr["getClass"]){
let Type = (arr.getClass().getComponentType()+"").replace(/class /g, "");
return Type;
}
if (typeof(arr[0]) == 'string') {
if (types[arr[0]]) {
var classz = Packages["java.lang." + types[arr[0]]].TYPE;
}
if (this.findClassOrNull(arr[0])) {
var classz = this.findClassOrNull(arr[0]);
}
}
if (this.#js_types[typeof(arr[0])]) {
let Type = this.#js_types[typeof(arr[0])];
if (typeof(arr[0]) == "number") {
Type = types[this.isInteger(arr[0]) ? "int" : "double"];
}
var classz = Packages["java.lang." + Type].TYPE || Packages["java.lang." + Type];
} else if (arr[0][$autojs.java.className]) {
var classz = arr[0];
} else if (arr[0].getClass()) {
var classz = arr[0];
}
return classz;
}
multiarr(arr, a=1, arr_len=[]) {
if(arr instanceof Array){
if(arr_len.length == 0){
arr_len.push(arr.length);
}
for (let i in arr) {
if (i==0 && arr[i] instanceof Array) {
a++;
arr = arr[i];
arr_len.push(arr.length);
this.multiarr(arr, a, arr_len);
}
}
}
return arr_len;
}
multiarrFill(arr, javaarr){
let types = this.#java_types;
if(arr instanceof Array){
for(let i in arr){
if(arr[i] instanceof Array){
this.multiarrFill(arr[i], javaarr[i]);
} else {
if(i <= javaarr.length-1){
if(typeof(arr[i]) == "number"){
let Type = (javaarr.getClass().getComponentType()+"").replace(/class /, "");
let classz = types[Type]?Packages["java.lang." + types[Type]]:Packages[Type];
arr[i] = new classz(arr[i]);
}
java.lang.reflect.Array.set(javaarr, new java.lang.Integer(i), arr[i]);
}
}
}
}
return javaarr;
}
fromTypeAndLength(...args) {
let types = this.#java_types;
if (types[args[0]]) {
var classz = Packages["java.lang." + types[args[0]]].TYPE;
} else if (this.#js_types[typeof(args[0])]) {
if (this.findClassOrNull(""+args[0])) {
var classz = this.findClassOrNull(args[0]).class;
} else {
let Type = this.#js_types[typeof(args[0])];
if (typeof(args[0]) == "number") {
Type = types[this.isInteger(args[0]) ? "int" : "double"];
}
var classz = Packages["java.lang." + Type].TYPE || Packages["java.lang." + Type].class;
}
} else if (args[0][$autojs.java.className]) {
var classz = args[0].class;
} else if (args[0].getClass()) {
var classz = args[0].getClass();
}
if (typeof(args[1]) == 'number') {
return java.lang.reflect.Array.newInstance(classz, args[1]);
}
if (args[1] instanceof Array){
return java.lang.reflect.Array.newInstance(classz, this.fromArray(args[1]));
}
return java.lang.reflect.Array.newInstance(classz, args[1]);
}
fromArgs(...args) {
let types = this.#java_types;
let multiInof = this.multiarr(args);
if(multiInof.length >= 2){
var multiType = this.multiarrType(args);
var multiJava = this.fromTypeAndLength(multiType, multiInof);
multiJava = this.multiarrFill(args, multiJava);
return multiJava;
}
let ClassArray = this.fromTypeAndLength(args[0], args.length);
for (let i in args) {
if(typeof(args[i]) == "number"){
let Type = (ClassArray.getClass().getComponentType()+"").replace(/class /, "");
let classz = types[Type]?Packages["java.lang." + types[Type]]:Packages[Type];
args[i] = new classz(args[i]);
}
java.lang.reflect.Array.set(ClassArray, new java.lang.Integer(i), args[i]);
}
return ClassArray;
}
fromArray(args) {
let types = this.#java_types;
let multiInof = this.multiarr(args);
if(multiInof.length >= 2){
var multiType = this.multiarrType(args);
var multiJava = this.fromTypeAndLength(multiType, multiInof);
multiJava = this.multiarrFill(args, multiJava);
return multiJava;
}
let ClassArray = this.fromTypeAndLength(args[0], args.length);
for (let i in args) {
if(typeof(args[i]) == "number"){
let Type = (ClassArray.getClass().getComponentType()+"").replace(/class /, "");
let classz = types[Type]?Packages["java.lang." + types[Type]]:Packages[Type];
args[i] = new classz(args[i]);
}
java.lang.reflect.Array.set(ClassArray, new java.lang.Integer(i), args[i]);
}
return ClassArray;
}
fromTypeAndArgs(type, ...args) {
let types = this.#java_types;
let multiInof = this.multiarr(args);
if(multiInof.length >= 2){
var multiType = type;
var multiJava = this.fromTypeAndLength(multiType, multiInof);
multiJava = this.multiarrFill(args, multiJava);
return multiJava;
}
let ClassArray = this.fromTypeAndLength(type, args.length);
for (let i in args) {
if(typeof(args[i]) == "number"){
let Type = (ClassArray.getClass().getComponentType()+"").replace(/class /, "");
let classz = types[Type]?Packages["java.lang." + types[Type]]:Packages[Type];
args[i] = new classz(args[i]);
}
java.lang.reflect.Array.set(ClassArray, new java.lang.Integer(i), args[i]);
}
return ClassArray;
}
fromTypeAndArray(type, args) {
let types = this.#java_types;
let multiInof = this.multiarr(args);
if(multiInof.length >= 2){
var multiType = type;
var multiJava = this.fromTypeAndLength(multiType, multiInof);
multiJava = this.multiarrFill(args, multiJava);
return multiJava;
}
let ClassArray = this.fromTypeAndLength(type, args.length);
for (let i in args) {
if(typeof(args[i]) == "number"){
let Type = (ClassArray.getClass().getComponentType()+"").replace(/class /, "");
let classz = types[Type]?Packages["java.lang." + types[Type]]:Packages[Type];
args[i] = new classz(args[i]);
}
java.lang.reflect.Array.set(ClassArray, new java.lang.Integer(i), args[i]);
}
return ClassArray;
}
}
var $JavaArray = new JavaArray();
export default $JavaArray;
export { JavaArray };