抢沙发
️,再摸摸半梦
忆然
-
使用数据包修改模组插入的野生作物、植被或生物生成 -
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述@mihono 这部分也是在最顶上拆出来的,应该,不用吧
-
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述@mihono 下面的用上我感觉比较难看,我按我觉得好看的来的
-
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述前言
ClassFilter是kjs的一个保护机制,笔者在这里不建议进行对ClassFilter动手脚
此篇仅以替换kjs的ClassFilter为例子讲解部分java的反射机制在kjs的使用
本文使用:CC-BY-NC-SA 4.0协议
话不多说,先上成品
这是在kjs里面使用反射爆破kjs的classfilter的实例let $ClassFilter = Java.loadClass("dev.latvian.mods.kubejs.util.ClassFilter") let $ServerScriptManager = Java.loadClass("dev.latvian.mods.kubejs.server.ServerScriptManager") let $KubeJS = Java.loadClass("dev.latvian.mods.kubejs.KubeJS") let ScriptManagers = { CLIENT: $KubeJS.getClientScriptManager(), SERVER: $ServerScriptManager.instance, STARTUP: $KubeJS.getStartupScriptManager(), } /**@type {Internal.Class<$JavaWrapper_>} */ let clazz = Java.class /**@type {Internal.Class<$ScriptManager_>} */ let $ScriptManager = clazz.getClassLoader().loadClass("dev.latvian.mods.kubejs.script.ScriptManager") let classFilterField = $ScriptManager.getDeclaredField('classFilter') classFilterField.setAccessible(true) classFilterField.set(ScriptManagers.SERVER, new $ClassFilter())下面进行解析
let $ClassFilter = Java.loadClass("dev.latvian.mods.kubejs.util.ClassFilter")
这一步是为获取新的ClassFilter以获取实例以替换已经完成的构建的ClassFilterlet $ServerScriptManager = Java.loadClass("dev.latvian.mods.kubejs.server.ServerScriptManager")
let $KubeJS = Java.loadClass("dev.latvian.mods.kubejs.KubeJS")
let ScriptManagers = {
CLIENT: $KubeJS.getClientScriptManager(),
SERVER: $ServerScriptManager.instance,
STARTUP: $KubeJS.getStartupScriptManager(),
}
在这步获取了全部的ScriptManagerlet clazz = Java.class
这一步获取了Class<JavaWrapper>实例,在后面用于获取类加载器去加载我们需要的类let $ScriptManager = clazz.getClassLoader().loadClass("dev.latvian.mods.kubejs.script.ScriptManager")
获取Class<ScriptManager>let classFilterField = $ScriptManager.getDeclaredField('classFilter')
获取Class<ScriptManager>的classFilter字段(这是我们需要修改的地方)classFilterField.setAccessible(true)
因为classFilter字段是私有的,我们需要开放他的权限classFilterField.set(ScriptManagers.SERVER, new $ClassFilter())
将set方法的第一个参数的classFilter字符替换为我们的新ClassFilter
(此处仅替换了server的,有其他的需要替换就修改第一个参数)至此,kjs的classfilter就被我们优雅(雾)的处理掉了
-
怎么没有板式斑块在壁画发图片不就行了()
-
我永远喜欢kubejs!@Mafuyu 我喜欢你!!!!!
-
我永远喜欢kubejs!@read 呜,苦路西
-
我喜欢你@read 补药啊,没有你我的对话框谁来补啊


-
我喜欢你@kaleb223 我只想催更,我要坐享其成!
-
我永远喜欢kubejs!@魔改哥布林 你这个人,满脑子想的都是自己呢(嫌弃)
-
我喜欢你重生也要催你做对话框



-
我永远喜欢kubejs!@半梦 喵呜!(逃)
-
我永远喜欢kubejs!在编程的世界里,我深深爱着 kubejs
。
它就像是一个神奇的魔法工具,为我的游戏模组创作带来了无尽的可能。
每次使用 kubejs 编写代码时,我都感觉像是在开启一场奇妙的冒险。
简洁而强大的语法,让我能够轻松地实现各种创意。
不用再为复杂的底层细节烦恼,只需专注于打造独一无二的游戏体验。kubejs 的社区也超级温暖,大家互相交流、分享经验,就像一个快乐的大家庭。
遇到问题时,总能迅速得到热心的帮助,这种感觉简直太棒了!
我爱 kubejs 的每一处设计,爱它带来的无限乐趣。
无论是自定义物品、添加新方块,还是编写复杂的机制,它都能出色地完成任务。
每一个功能都如同璀璨的星星,点亮了我创作的道路。
kubejs,你是我心中永远的宝藏,我会一直喜欢你,用你创造出更多精彩的模组,让游戏的世界更加丰富多彩
! -
血肉重铸是一个很可爱的模组!WTF