当前位置:首页 > CN2资讯 > 正文内容

java我的世界换地图 我的世界java地图怎么升级

3天前CN2资讯


1. 结合 jad/mc 命令在线修改使用

jad 命令:  将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;

mc命令:Memory Compiler/内存编译器,编译.java文件生成.class。

redefine命令:加载外部的.class文件,redefine jvm 已加载的类。

步骤:

1. 使用 jad 将.class导出为 .java

jad --source-only demo.MathGame > /tmp/MathGame.java

 修改对应导出 .java文件

2. 使用 mc 将修改的 .java文件编译为 .class文件

[arthas@3434]$ mc /tmp/MathGame.java -d /tmp/ Memory compiler output: /tmp/demo/MathGame.class Affect(row-cnt:1) cost in 795 ms.

3. 使用redefine 将编译好的 .class文件更新到 jvm

[arthas@3434]$ redefine /tmp/demo/MathGame.class redefine success, size: 1, classes: demo.MathGame

结果:

2. 直接上传修改好的 class文件更新

本地修改代码,将修改好的 class 文件上传到服务器

[arthas@5230]$ redefine /tmp/demo/MathGame.class redefine success, size: 1, classes: demo.MathGame [arthas@5230]$

更新后的结果: 

 注意事项:

1. 保证你的arthas运行环境和监控的项目运行环境是一致的,是jdk而不是jre(最好环境变量中配置也是jdk)

2. mc 命令有可能失败。如果编译失败可以在本地修改好java文件,再上传到服务器通过mc命令编译。(如上:2. 直接上传修改好的 java文件更新 )

3. redefine 后的原来的类不能恢复,redefine 有可能失败(比如增加了新的 field)

4.  redefine 与 Retransform限制

  • 不允许新增加 field/method
  • 正在跑的函数,没有退出不能生效

5.redefine命令和 jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置。 原因是 jdk 本身 redefine 和 Retransform 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。可以使用命令 retransform 来代替 redefine ,如下演示

这里我热更新成功后,再次执行 jad 后 jad重置了我热更新的class文件:

[arthas@5230]$ jad --source-only demo.MathGame /* * Decompiled with CFR. */ package demo; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit; public class MathGame { private static Random random = new Random(); private int illegalArgumentCount = 0; public List<Integer> primeFactors(int n) { /*16*/ if (n < 2) { /*17*/ ++this.illegalArgumentCount; throw new IllegalArgumentException("number is: " + n + ", need >= 2"); } ArrayList<Integer> arrayList = new ArrayList<Integer>(); /*21*/ int n2 = 2; /*22*/ while (n2 <= n) { /*23*/ if (n % n2 == 0) { /*24*/ arrayList.add(n2); /*25*/ n /= n2; /*26*/ n2 = 2; /*27*/ continue; } /*29*/ ++n2; } /*31*/ return arrayList; } public static void main(String[] stringArray) throws InterruptedException { MathGame mathGame = new MathGame(); while (true) { /*37*/ mathGame.run(); /*38*/ TimeUnit.SECONDS.sleep(1L); } } public void run() throws InterruptedException { try { /*44*/ int n = random.nextInt() / 10000; /*45*/ List<Integer> list = this.primeFactors(n); /*46*/ MathGame.print(n, list); } catch (Exception exception) { /*49*/ System.out.println(String.format("-----------------illegalArgumentCount:%3d, ", this.illegalArgumentCount) + exception.getMessage()); } } public static void print(int n, List<Integer> list) { StringBuffer stringBuffer = new StringBuffer(n + "="); /*55*/ for (int n2 : list) { /*56*/ stringBuffer.append(n2).append('*'); } /*58*/ if (stringBuffer.charAt(stringBuffer.length() - 1) == '*') { /*59*/ stringBuffer.deleteCharAt(stringBuffer.length() - 1); } /*61*/ System.out.println(stringBuffer); } } [arthas@5230]$

 重新编译,使用 retransform 热更新后正常使用 jad 并且不会重置:

[arthas@5230]$ retransform /tmp/demo/MathGame.class retransform success, size: 1, classes: demo.MathGame [arthas@5230]$

补充: 

消除 retransform 的影响

如果对某个类执行 retransform 之后,想消除影响,则需要:

  • 删除这个类对应的 retransform entry
  • 重新触发 retransform

如果不清除掉所有的 retransform entry,并重新触发 retransform ,则 arthas stop 时,retransform 过的类仍然生效。

查看 retransform entry

$ retransform -l Id ClassName TransformCount LoaderHash LoaderClassName 1 demo.MathGame 1 null null
  • TransformCount 统计在 ClassFileTransformer#transform 函数里尝试返回 entry 对应的 .class 文件的次数,但并不表明 transform 一定成功。

删除指定 retransform entry

需要指定 id:

retransform -d 1

删除所有 retransform entry

retransform --deleteAll

显式触发 retransform

$ retransform --classPattern demo.MathGame retransform success, size: 1, classes: demo.MathGame

注意:对于同一个类,当存在多个 retransform entry 时,如果显式触发 retransform ,则最后添加的 entry 生效(id 最大的)。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21528.html

    分享给朋友:

    “java我的世界换地图 我的世界java地图怎么升级” 的相关文章

    ColoCrossing怎么样?高性价比与稳定性的最佳选择分析

    ColoCrossing是一家自2003年起在网络主机市场崭露头角的公司,位于美国纽约州的布法罗市。这家公司以其稳定的性能和合理的价格而闻名,在美国的多个大城市设有数据中心,实现了从东海岸到西海岸的覆盖。这一遍布美国的基础设施,能够为各类业务提供灵活且可靠的网络服务。作为一个用户,我总能感受到Col...

    亚马逊CDN CloudFront:提升网站安全性与加载速度的理想选择

    亚马逊CDN概述 亚马逊CloudFront是亚马逊云科技旗下的一项内容分发网络(CDN)服务,它通过全球范围内的多个数据中心高效分发内容。我对这项服务的了解使我意识到,CloudFront不仅仅是一个简单的资源分发工具,它的设计旨在确保内容的流畅、高效、安全传输,尤其在当今对速度与安全性高度重视的...

    LeaseWeb旧金山数据中心:为企业提供高效IT基础设施解决方案

    在谈到全球范围内的IT基础设施解决方案时,LeaseWeb无疑是一个重要的名字。成立于荷兰的LeaseWeb,凭借其卓越的服务和强大的网络能力,已经发展成为一家全球性的科技公司。它不仅提供传统的独立服务器服务,还涵盖了云计算、服务器托管等多样化的解决方案。对我而言,LeaseWeb就像是一座桥梁,连...

    Virtono:高性价比的虚拟主机与云服务器解决方案

    在这个信息化迅猛发展的时代,虚拟主机与服务器服务需求越来越高。而提到这个领域,其中有一家备受注目的公司,那就是Virtono。成立于2014年的Virtono,凭借其卓越的产品与服务迅速在全球市场上崭露头角。对于我来说,Virtono的故事不仅仅代表着一家公司,更是一段不断创新与发展的旅程。 Vir...

    便宜日本VPS的选择与比较:性价比高的供应商推荐

    在当今数字化时代,VPS(虚拟专用服务器)正成为许多企业和个人的首选解决方案,尤其是在日本市场。对于那些需要可靠网络服务的用户来说,这无疑是一个非常实用的选择。日本的VPS服务以其高性能和稳定性著称,深受开发者、小型企业、网站管理员等用户的喜爱。 日本VPS的定义并不复杂,简单来说,它是一种虚拟化技...

    全面掌握路由测试:提升网络性能的关键技术与工具

    路由测试的定义 路由测试,简单来说,就是对网络路由器性能和功能进行的一系列评估和验证。它帮助我们了解网络设备如何处理数据包,从而保证信息在传输过程中的安全和高效。这项测试通常涉及到监测路由器的各种指标,比如数据包的转发速度、延迟和网络稳定性,以确保设备符合预期的性能标准。 当我第一次接触路由测试时,...