zoukankan      html  css  js  c++  java
  • 修改jar的.class文件,并重新打包

    原文:https://www.cnblogs.com/baby123/p/10871154.html

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

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

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

    Javassist下载地址 查看

    1.准备jar包

    my/Solution.java

    View Code

    my/Encrypt.java

    View Code

    新建resource

    编译 javac  -sourcepath my my ools*.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-INFMANIFEST.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("	" + 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

     完成

  • 相关阅读:
    第4課 部屋に机といずがあらます。
    (转)三层结构设计与ERP部署规划
    多线程的一个问题(同步事件和等待句柄)转
    C#操作xml小结(转)
    再论Assembly Registration Tool (Regasm.exe)
    再论Type Library Importer (Tlbimp.exe)
    Blittable and NonBlittable Types
    再论Importing a Type Library as an Assembly
    .Net Remoting(基本操作) Part.2 (转)
    Monitor类示例(转)
  • 原文地址:https://www.cnblogs.com/shihaiming/p/13024607.html
Copyright © 2011-2022 走看看