反射命令 (Reflection Command)
模组属性评比

距离显示结果还剩3票~

路过的这位少侠,你觉得这款Mod怎么样,可否愿意来评一评它呢?登录并评比
更新日志
  • 暂无日志..

历史编辑记录更多
    管理组申请

      暂无管理组..

    编辑组申请

      暂无编辑组..

    开发组申请
    最近参与编辑
    开源

    反射命令

    Reflection Command

    --

    初出茅庐

    昨日指数: -
    昨日平均指数: 67.732

    9411

    总浏览

    --

    资料填充率


    下载本模组
    • 本模组仅供娱乐


      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,该指令将

        • 示例:/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`

          把全局变量表压入栈。

    短评加载中..