java class修改_为什么直接修改java的.class文件会导致程序崩溃

是这样的。

有一次,hardcode了ip地址在代码里,由于懒得重新编译。

强行用记事本打开.class文件,发现里面已经面目全非了,但是数字还是原来的样子。

于是直接改了.class文件里的数字,换了个ip地址,结果运行时是直接崩溃的。

为什么呢?是有什么检查机制吗?

-------补充--------------

不好意思 描述不太准确啊

补充个例子

1)我先新建了一个.java

public class Test {

public Test() {

}

public static void main(String[] args) {

String ip = "172.18.81.111";

System.out.println(ip);

}

}

然后

javac Test.java

运行java Test

结果正常

输出 172.18.81.111

2)然后我用vim修改.class文件

Êþº¾^@^@^@4^@^]

^@^F^@^O^H^@^P ^@^Q^@^R

^@^S^@^T^G^@^U^G^@^V^A^@^F^A^@^C()V^A^@^DCode^A^@^OLineNumberTable^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@

SourceFile^A^@ Test.java^L^@^G^@^H^A^@^M172.18.81.111^G^@^W^L^@^X^@^Y^G^@^Z^L^@^[^@^\^A^@^DTest^A^@^Pjava/lang/Object^A^@^Pjava/lang/System^A^@^Cout^A^@^ULjava/io/PrintStream;^A^@^Sjava/io/PrintStream^A^@^Gprintln^A^@^U(Ljava/lang/String;)V^@!^@^E^@^F^@^@^@^@^@^B^@^A^@^G^@^H^@^A^@ ^@^@^@^]^@^A^@^A^@^@^@^E*·^@^A±^@^@^@^A^@

^@^@^@^F^@^A^@^@^@^D^@ ^@^K^@^L^@^A^@ ^@^@^@+^@^B^@^B^@^@^@^K^R^BL²^@^C+¶^@^D±^@^@^@^A^@

^@^@^@^N^@^C^@^@^@^H^@^C^@

^@

^@^K^@^A^@^M^@^@^@^B^@^N

~

~

上面的.class文件中明显有一串数字,直接修改之。

然后再运行java Test

Error: A JNI error has occurred, please check your installation and try again

Exception in thread "main" java.lang.ClassFormatError: Unknown constant tag 49 in class file Test

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:760)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)

at java.net.URLClassLoader.access$100(URLClassLoader.java:73)

at java.net.URLClassLoader$1.run(URLClassLoader.java:368)

at java.net.URLClassLoader$1.run(URLClassLoader.java:362)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:361)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

为什么修改个数字就会崩溃呢?

### 回答1: 在线修改class文件即在程序运行时对class文件进行修改,并将修改后的结果应用到程序中。这种操作在某些特定情况下非常有用,例如需要对某个类的行为进行调试或者进行功能测试时,可以通过在线修改class文件来实现快速验证功能的效果和正确性。 在线修改class文件的方法有多种,其中比较常见的一种是使用Java Agent机制来完成。Java Agent是一种Java平台提供的机制,它可以在程序启动时对程序的字节码进行转换和增强,并在程序运行时对应用的行为进行动态的修改。使用Java Agent来进行在线修改class文件时,可以借助bytecode engineering工具,对class文件进行访问和修改,从而实现一些高级、复杂的功能。 除此之外,还有一些第三方工具也可以用来进行在线修改class文件,例如Bytecode Viewer、ASM等。这些工具提供了丰富的API和插件,可以方便地进行class文件的编辑、修改和调试。使用这些工具可以快速对Java类进行修改,同时还可以对代码进行实时调试和测试,提高编码效率。 需要注意的是,在线修改class文件可能涉及到一些安全问题,因此需要谨慎操作,避免对程序的稳定性和可靠性产生不良影响。此外,需要确保修改后的class文件与原始的class文件兼容,并且在不修改代码的情况下,保持程序的正常运行。 ### 回答2: 在线修改class文件是指在程序运行时动态地修改已经编译好的Java文件。这种技术可以用来进行调试或者对程序进行动态修改。 在Java中,可以使用一些工具来实现在线修改class文件。比较常用的有两种方式: 一种是使用Java自带的Instrumentation API,在程序启动时进行初始化,并且在运行时对类进行修改,这样可以拦截类的加载,从而对类进行修改。 另一种方式则是使用第三方工具,比如JRebel。JRebel可以在应用运行时自动加载和应用class文件的更改,从而增加了开发者的生产力,减少了项目开发周期。 无论使用哪种方式,都需要注意在线修改class文件程序的稳定性造成一定的影响,如果不谨慎使用可能导致应用程序崩溃或者出现其他问题。因此,在进行这种操作时,一定要仔细测试,并且在生产环境中谨慎使用。 ### 回答3: 在Java中,class文件是编译后的Java代码,它是Java程序在计算机上运行的最终形式。在线修改class文件指的是在程序运行时,修改class文件中的一些内容而不需要重新编译整个程序。 在线修改class文件通常是用于调试和测试目的。它可以允许开发者实时修改程序的行为,并且可以减少调试时间,提高程序开发效率。 为了实现在线修改class文件,我们可以使用一些工具,比如Java Agent和字节码操作框架ASM。Java Agent是一个Java应用程序,在程序运行时可以修改类加载器的行为,从而实现对class文件的动态修改。字节码操作框架ASM则提供了直接修改class文件字节码的能力。 需要注意的是,虽然在线修改class文件可以提高程序开发效率,但在生产环境中不建议使用。因为这样做可能导致程序运行出现意想不到的错误,甚至影响程序安全性。最好还是在开发调试阶段进行在线修改,将修改后的代码重新编译并部署到生产环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值