本模组仅供娱乐
1.16.5版
增加了可以使用Java反射的命令:/reflect
/reflect有9个子命令:assign, literal, print, field, get, method, invoke, runcommand, clearvars
/reflect assign <target> <source>
赋值:把source的值赋给target,如果target为"_all",则将source的值赋给所有变量
示例:/reflect assign myVar _temp,该指令把_temp的值赋给myVar——相当于代码myVar=_temp;
/reflect literal <byte|short|int|long|float|double|char|boolean|string> <text>
字面量:根据类型解析字面量,并把解析的结果储存到变量_temp,其中,long、float、double类型没有L、F、D的单位,char被视为无符号整数类型,string不带引号
示例:/reflect literal char 48,该指令把48当做无符号整数char解析,结果为48,即字符'0'
/reflect print <var>
打印:将变量var打印到聊天栏或命令方块反馈栏中
示例:/reflect print _temp,该指令把_temp的类型和值打印到聊天栏或命令方块反馈栏中
/reflect field <class> <field>
字段:获取class类的field字段(是一个java.lang.reflect.Field对象,不是这个字段的值),并储存到_temp变量
示例:/reflect field java.lang.Character MAX_VALUE,该指令获取了java.lang.Character的MAX_VALUE字段,作为一个java.lang.reflect.Field对象,储存到变量_temp——相当于代码_temp=java.lang.Character.class.getField("MAX_VALUE");
/reflect get <subject>
获取:获取变量subject的储存在变量_temp的字段的值,并储存到变量_temp。这要求变量_temp必须是一个java.lang.reflect.Filed对象。如果是访问静态字段,subject填null
示例:/reflect get null,假设当前_temp的值为上方的示例所获取的字段,则该指令以null为主体(因为是静态字段)获取了java.lang.Character的MAX_VALUE字段的值('\uFFFF'),作为一个java.lang.Character对象,储存到变量_temp——相当于代码_temp=((Field)_temp).get(null);
/reflect method <class> <method> [paras]
方法:获取class类的名为method的参数列表为paras的方法或构造器(是一个java.lang.reflect.Method或java.lang.reflect.Constructor对象,不是调用这个方法或构造器)。如果method填new或<init>,则获取构造器,否则获取方法。paras填每个参数的类名,之间用单个空格分开。如果没有参数,则不要填paras
示例:/reflect method java.lang.String substring int int,该指令获取了java.lang.String的substring(int, int)方法,作为一个java.lang.reflect.Method对象,储存到变量_temp——相当于代码_temp=java.lang.String.class.getMethod("substring", int.class, int.class);
/reflect invoke <subject> [paras]
调用:以变量subject为主体调用储存在变量_temp的方法或构造器,传入变量paras参数,并把返回值储存到_temp。这要求_temp必须是一个java.lang.reflect.Method或java.lang.reflect.Constructor对象。如果是调用静态方法或构造器,则subject填null。paras填每个参数的变量名,之间用单个空格分开。如果没有参数,则不要填paras。
示例:/reflect invoke str start end,假设当前str是一个String,start和end都是Integer,_temp的值为上方的示例所获取的方法,则该指令以str为主体调用了substring方法,传入参数start和end,并把返回值储存到变量_temp——相当于代码_temp=((Method)_temp).invoke(str, start, end);
/reflect runcommand <command>
运行指令:对变量command调用Objects.toString方法,并将返回的字符串当做命令执行。执行参数(执行者、位置、角度、维度等)与该命令执行的相同。
示例:/reflect runcommand str,假设当前str是"tp ~ ~1 ~",则会将执行者传送到其上方一格——相当于指令/tp ~ ~1 ~;
/reflect clearvars
清除变量:清除所有变量
1.19.2-0.1.0.0版
指令树:
- `relfect`
- `literal`
解析一个字面量并压入栈
- `byte|short|int|long +|- 2|8|10|16 <整数字面量>`
`+|-`表示有符号 | 无符号,`2|8|10|16`表示二进制 | 八进制 | 十进制 | 十六进制
- `char <字符字面量>`
支持转义字符;不带单引号
- `boolean true|false`
- `float|double <浮点数字面量>`
支持普通小数(如1024.0)、科学计数法(如1.024e3)、十六进制科学计数法(如0x2p10)
- `string <字符串字面量>`
不带双引号
- `class <类名>`
获取`Class`对象,类名为全限定类名。
- `store <变量名>`
弹出栈顶对象并存入全局变量表中
- `load <变量名>`
从全局变量表中获取对象并压入栈
- `pop`
弹出栈顶对象
- `new <构造器名>`
调用构造器,弹出与构造器参数数量相同的栈顶对象作为参数,构造器创建的对象压入栈。
`构造器名`格式:`全限定类名+参数全限定类名1-参数全限定类名2-……`,如`java.util.ArrayList+int`、`java.lang.RuntimeException+java.lang.String-java.lang.Throwable`
- `invoke <方法名>`
调用方法,如果不为静态方法,则弹出栈顶对象作为被调用对象,弹出与方法参数数量相同的栈顶对象作为参数,返回值压入栈。
`方法名`格式:`全限定类名+方法名+参数全限定类名1-参数全限定类名2-……`,如`java.util.List+get+int`、`java.lang.String+substring+int-int`
- `getfield <字段名>`
获取字段的值。如果不为静态字段,则弹出栈顶对象作为被访问对象,获取到的值压入栈。
`字段名`格式:`全限定类名+字段名`,如`java.lang.Integer+MAX_VALUE`
- `putfield <字段名>`
设置字段的值。如果不为静态字段,则弹出栈顶对象作为被访问对象,然后弹出栈顶对象,并把字段的值设为该对象。
- `astore`
把对象存入数组。从栈弹出3个对象,第一个作为索引,第二个作为数组,第三个作为存入数组的对象。
- `aload`
从数组获取对象。从栈弹出2个对象,第一个作为索引,第二个作为数组,获取到的值压入栈。
- `stack`
把全局栈压入栈。
- `vars`
把全局变量表压入栈。