使用javassist修改.class文件,并重新打包

Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。熟练使用这套工具,可以让Java编程更接近与动态语言编程。

下面实现如何修改jar包里的方法

Javassist下载地址 查看

1.准备jar包

my/Solution.java

package my.tools;
public class Solution{ public int lengthOfLongestSubstring(String s) {
int longSub = 0;
if(s.isEmpty()) return 0;
if(s.length()==1) return 1;
char[] arr = s.toCharArray();
String str = String.valueOf(arr[0]);
longSub = 1;
for(int i=1;i<s.length();i++){
int pos = str.indexOf(arr[i]);
if (pos !=-1) {
str = str.substring(pos+1)+arr[i];
}else{
str+=arr[i];
}
if(str.length()>longSub) longSub = str.length();
}
return longSub;
} public int strStr(String haystack, String needle) { if(needle.isEmpty()||needle.equals(haystack)) return 0;
int l=needle.length();
int r = haystack.length()-l;
for(int i=0;i<r+1;i++){
String tempStr=haystack.substring(i,l+i);
if(tempStr.equals(needle))
return i;
}
return -1;
} }

my/Encrypt.java

package my.tools;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.math.BigInteger;
import java.net.URLDecoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class Encrypt {
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("dont have algorithm");
} String md5code = new BigInteger(1, secretBytes).toString(16); for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
} public static String decrypt(String message, String key) throws Exception {
byte[] bytesrc = convertHexString(message);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); cipher.init(2, secretKey, iv); byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte);
} public static byte[] convertHexString(String ss) {
byte[] digest = new byte[ss.length() / 2];
for (int i = 0; i < digest.length; i++) {
String byteString = ss.substring(2 * i, 2 * i + 2);
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = ((byte) byteValue);
}
return digest;
} public static String decode(String value) {
try {
return URLDecoder.decode(decrypt(value, "Yst@2_BI"), "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

新建resource

编译 javac  -sourcepath my my\tools\*.java -d resource

META-INF/MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.8.0_151 (Oracle Corporation)

进入resource打包  jar -cvfm mytools.jar META-INF\MANIFEST.MF *

使用

import my.tools.Solution;

public class Main {

    public static void main(String[] args) {

        System.out.println(new Solution().strStr("aacabseew", "ab"));
}
}

输出:3

实现的查找第二个字符串出现的位置

2.修改编译后的class

导入下载的Javassist里的javassist.jar

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod; public class Main { public static void main(String[] args) { try {
ClassPool.getDefault().insertClassPath("data/mytools.jar");
CtClass c2 = ClassPool.getDefault().getCtClass("my.tools.Solution");
CtMethod[] ms = c2.getDeclaredMethods();
for (CtMethod c : ms) {
System.out.println(c.getName());
CtClass[] ps = c.getParameterTypes();
for (CtClass cx : ps) {
System.out.println("\t" + cx.getName());
}
if (c.getName().equals("strStr") && ps.length == 2
&& ps[0].getName().equals("java.lang.String")
&& ps[1].getName().equals("java.lang.String")) {
c.setBody("{System.out.println($1);return 0;}");
}
}
c2.writeFile(); } catch (Exception e) {
e.printStackTrace();
}
}
}

运行后会在项目根目录下生成修改后的class文件

3.生成新的jar

将以前的jar包修改mytools.zip

解压mytools.zip为mytools1,将刚才生成的my/tools/Solution.class替换掉mytools1里的Solution.class,

压缩mytools1为mytools1.zip

修改文件名为mytools1.jar

导入新的jar包

测试

import my.tools.Solution;

public class Main {

    public static void main(String[] args) {

        System.out.println(new Solution().strStr("aacabseew","ab"));

    }
}

输出

aacabseew
0

完成

修改jar的.class文件,并重新打包的更多相关文章

  1. linux下修改jar中的文件

    解压修改后再打包 解压: jar xvf xxx.jar 打包: jar cvfm0 xxx.jar META-INF/MANIFEST.MF ./ 注: -m参数可以将 一个具体的mainfest文 ...

  2. Java实现动态修改Jar包内文件内容

    import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; ...

  3. Java 操作jar包工具类以及如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  4. Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  5. Android 编程下如何修改 jar 文件的包名

    首先我们要说说为什么要修改 jar 文件的包名,jar 包我们会非常高频率的使用,尤其是用一些其他三方库的时候,往往把 java 代码打包成 jar 文件,方便项目依赖使用.笔者在开发过程中遇到过一些 ...

  6. 修改jar中的class文件

    在工作中有可能会遇到需要修改jar的情况.正常情况下,如果有源代码的话,就比较容易,直接修改源代码,再导出新的jar文件即可.但是如果没有源代码就比较麻烦了,下面记录了没有源代码的情况修改jar的方法 ...

  7. 曹工杂谈:Linux服务器上,Spring Boot 原地修改 jar 包配置文件/替换class文件,免去重复上传的麻烦

    一.前言 相信很多同学有这样的需求,现在很多公司都有多地的研发中心,经常需要跨地区部署,比如,博主人在成都,但是服务器是北京的.一般城市间网络都不怎么好,上传一个几十兆的jar包那是真的慢,别说现在微 ...

  8. 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!

    修改jar包配置文件的正确操作,有的时候通过一些解压工具可以对内部的文件进行修改,但是有时候会无效.这就很烦了 一.背景:       有一个springboot项目,事先我已经用编译好打成jar包以 ...

  9. 使用fat jar和exe4j把java程序打包成exe执行文件---转载的

    java应用编写测试好之后都是jar包或class文件,客户拿到这个东西后一般是不会java开发者那样在命令窗口下面输入运行的.客户要求的就是直接点击应用名称运行.java在方面做得很不友好,开发人员 ...

随机推荐

  1. oracle 年龄分档,不用case when 的方法

    一般我们出分档数据都是case when ,但是如果是对年龄等一些字段进行细分,比如五岁一档,我们如果用case when就会特别麻烦,写的特别多,这里我介绍一种简单的方法,对细分的字段进行处理: 建 ...

  2. 四行公式推完神经网络BP

    据说多推推公式可以防止老年痴呆,(●ˇ∀ˇ●) 偶尔翻到我N年前第一次推导神经网络的博客居然四页纸,感慨毅力! http://blog.sina.com.cn/s/blog_1442877660102 ...

  3. 关于吲哚美辛(NSAIDS)对袢利尿药的影响。

    吲哚美辛 一方面是解热镇痛抗炎药,是最强的PG合成酶抑制药之一,另一方面,吲哚美辛可于袢利尿药如呋塞米.依他尼酸竞争近曲小管有机酸分泌途径,可以影响后者的排泄和作用. 吲哚美辛可以抑制前列腺素的合成, ...

  4. Oracle 查看index是否失效

    一.普通索引是否失效 select * from dba_indexes s where s.owner  in ('ISMP','BOSS','PAY','ACCOUNT','SETTLE','TE ...

  5. Log4net 数据库存储(四)

    1.新建一个空的ASP.Net 空项目,然后添加Default.aspx窗体 2.添加配置文件:log4net.config <?xml version="1.0" enco ...

  6. 24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度

    https://www.cnblogs.com/yangfengwu/p/11204436.html 刚才有人说需要点鸡汤.... 我想想哈;我还没问关于哪方面的鸡汤呢!!! 我所一直走的路线 第一: ...

  7. 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛

    Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...

  8. 桥接:JS调用安卓方法报错Uncaught Error: Error calling method on NPObject

    说一说自己粗心踩到的一个不算坑的坑: 项目是安卓webview嵌入SPA单页应用页面,涉及到JS调用原生安卓方法,但就是在调用安卓方法时死活一直报错xxx  NPObject一堆错误.写了一个测试页面 ...

  9. 超级简单的tab点击

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Java使用Jsoup之爬取博客数据应用实例

    导入Maven依赖 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <g ...