vault backup: 2026-11-07 16:33:44
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
|
||||
|
||||
原创 阿伟的水杯 阿伟的水杯
|
||||
|
||||
_2026年4月15日 17:01_ _广东_
|
||||
|
||||
现在有一个打包好的jar包,如果我想修改jar包里某个类的某段代码,但是我又不会写字节码,那要如何操作呢?
|
||||
|
||||
很简单,主要是利用了javassist库去直接操作打包好的字节码
|
||||
|
||||
先引入:
|
||||
|
||||
```
|
||||
<dependency>
|
||||
```
|
||||
|
||||
然后直接上代码:
|
||||
|
||||
```
|
||||
public static void main(String[] args) throws Exception {
|
||||
```
|
||||
|
||||
运行,就会把那个class单独打包出来了,把class覆盖回jar包就可以了。
|
||||
|
||||
使用命令
|
||||
|
||||
```
|
||||
jar uvf xxxx.jar com/xxx/af/f/e.class
|
||||
```
|
||||
|
||||
就可以直接替换jar包里的类了。
|
||||
|
||||
解析:
|
||||
|
||||
首先是引入包,以及类,这个很简单,使用压缩软件打开jar包就知道对应的类名是什么了:
|
||||
|
||||
```
|
||||
ClassPoolclassPool= ClassPool.getDefault();
|
||||
```
|
||||
|
||||
接着重点就是构造内容:
|
||||
|
||||
```
|
||||
//要改动的方法
|
||||
```
|
||||
|
||||
有多种方法获取对应方法:
|
||||
|
||||

|
||||
|
||||
根据方法的参数情况选择对应的处理方法即可。
|
||||
|
||||
接着是构造方法体的代码:
|
||||
|
||||
javassist不需要写字节码,完全按普通java代码写即可。只要改几个地方:
|
||||
|
||||
1. 类名,因为类名涉及import,所以一般用类的全名,可以有效规避import的问题,不用import类。
|
||||
|
||||
2.入参写法,入参要使用**`$1, $2...`**代表方法的第 1、2... 个参数
|
||||
|
||||
其他的特殊符号还包括:
|
||||
|
||||

|
||||
|
||||
编写完成后,覆盖方法的时候,有几种常见覆盖方法:
|
||||
|
||||

|
||||
|
||||
无论是哪个方法,多行代码的内容前后都要添加大括号
|
||||
|
||||

|
||||
|
||||
总结:简单的修改jar包内容,在缺失源码的情况下想修改某个功能时,可以很好的派上用场
|
||||
Reference in New Issue
Block a user