首页 > 其他分享 >编辑jar包中class文件的几种方式

编辑jar包中class文件的几种方式

时间:2024-01-25 14:58:20浏览次数:20  
标签:包中 文件 java jar 修改 class

原文地址 blog.csdn.net

在日常的开发中经常使用到第三方一些库,这些库可能提供gradle仓库的依赖,也可能提供jar包,有时候为了我们的一些自定义操作,需要修改这些jar包中的代码.这个时候该怎么做呢?

我所了解的可以修改jar中class的几种方式

  1. aop编程,使用aop框架hook想要修改的class的方法,自己实现这个方法或者额外的执行一些代码,但既然是aop,aop的目的也不是這样的,aop适合于面向切面的,多点修改的情况.虽然也能达到目的,但并不适合今天的场景.
  2. 自定义gradle插件,继承Transform在里面找到要修改的class用javassist等工具修改对应的代码,这个也是aop实现的一种方式.也不适合今天的情况.
  3. 使用JD-GUI这样的decompile工具,打开jar包中的class文件,另存为.java文件修改相应的代码后,重新编译替换原来jar包中的class文件.今天开始也采用這样的方法,但是发现了一些需要注意的点:
    1. 如果类中有匿名内部类,反编译出来的代码进行编辑的时候需要修改一些引用上的错误.这个问题应该是避免不了的.
    2. 重新编译需要对应的环境,原类在什么包中,编辑的类也需要在对应的包中,编辑的环境还需要依赖对应的jar包.不然是不能正常编译出class的.
    3. 编辑后编译生成的class文件,应该连生成的内部类全部替换,防止有一些没注意到的修改没有替换到.造成非预期情况的发生.
  4. 这个方法和3类似,也是今天使用的方法.还是使用JD-GUI,decompile另存为.java文件,然后在as中创建对应的包,copy .java文件到其中进行编辑,這样的好处是修改方便,和正常的修改代码一样.修改完成后不再拷贝生成的class文件到jar包中,因为最后这些class文件都会合并到一处,最近打包成dex,拷不拷贝都一样.

今天使用的方法的大概流程

另存为.java文件

下载安装JD-GUI,打开需要修改的jar包,找到想要修改的class文件, Ctrl+s保存为.java文件.

jdgui

拷贝到项目中修改

建立对应的包,拷贝到包中修改,这个module需要依赖这个jar包.

fille

合并处理

修改完成后直接assemble的话是会报错的,因为jar包中有和这个.java文件编译生成的同名class文件.有几种处理方式:

  1. 删除jar包中这个类的class,包括内部类的class哦,这个最简单粗暴.

  2. 实现gradle插件在Transform中过滤掉对应的类不拷贝,没有进行尝试,感觉是可以实现的.但是有点舍近求远的意思.

  3. 另外开始想不依赖这个jar包,直接把jar中的class解压到class目录下,解压的过程中,过滤掉不要的class,debug模式下已经实现,但是release的时候报找不到要依赖的类,这个方法目前有2个点还需要明确.

    1. 如何在JavaCompile的时候获取这次编译的buildType.如果可以获取到,在release的时候就把jar解压到对应的目录下,這样还会报找不到类么?
    2. 怎么让model依赖一个目录中的class?

    如果可以解决这2个问题之一应该可以让这个方案得以实现,假如在不允许修改jar的情况下,这种方法就有作用了.

现在还是使用的方法1来实现,其他的方法待测试.

标签:包中,文件,java,jar,修改,class
From: https://www.cnblogs.com/cps666/p/17987141

相关文章

  • jclasslib 插件安装及使用
    原文地址blog.csdn.net学习Java,必须要了解JVM,而学习JVM知识时,总要去研究一些字节码指令而jclasslib这个插件很好的解决了这个问题jclasslib安装:1.打开设置或者按Ctrl+Alt+S,打开设置2.找到jclasslib插件点击install下载安装即可3.安装完重启,然后点击视图:......
  • 修改.class文件内容
    原文地址blog.csdn.net1.另存为.java文件下载安装JD-GUI,打开需要修改的jar包,找到想要修改的class文件,ctrl+s保存为.java文件2.修改.java文件内容,并生成.class文件修改.java文件内容并保存在当前文件夹的cmd中执行以下命令生成.class文件javac-c......
  • 极速初始化配置 Manjaro Linux with WSL2 的开发环境
    配置ManjaroLinux用户组安装完成后,我们需要配置ManjaroLinux系统才能开始使用。在命令行执行passwd以设置root的密码。根据最小权限原则(opensinanewtab),日常使用中,不能所有命令中都使用root权限进行操作,因此我们需要创建一个新的用户以供日常使用。参照ArchW......
  • Using classes exported from a DLL using LoadLibrary
    UsingclassesexportedfromaDLLusingLoadLibraryAnup.VRateme: 4.94/5(67votes)25Jan20056minread 368.5K    10.8K    129    41AnarticleonloadingaDLLexplicitlyusingLoadLibraryandusingthecla......
  • 使用jar命令替换jar包中指定文件
    一、jar命令用法`1. -c创建新的归档文件3.-t列出归档目录和文件5.-x解压缩已归档的指定(或所有)文件7.-u更新现有的归档文件9.-v在标准输出中生成详细输出/提供更详细输出信息11.-f指定归档文件名/为压缩包指定名字13.-m包含......
  • 详解img should be PIL Image. Got <class ‘numpy.ndarray‘>
    详解imgshouldbePILImage.Got当使用Python中的PIL(PythonImagingLibrary)库进行图像处理时,有时会遇到如下错误提示:imgshouldbePILImage.Got<class'numpy.ndarray'>。本文将解释该错误的原因和解决方法。问题描述在使用PIL库对图像进行处理时,如果将一个numpy.ndarray类......
  • js用前缀名查找class或id节点,js模糊查询某个dom节点
     1//参数dom为htmldom节点2//参数key为需模糊查询的名称字段3functionqueryClassNode(dom,key){4letcollectArray=[];5for(leti=0;i<dom.childNodes.length;i++){6//核心点7if(d......
  • Go语言核心36讲 42 | bufio包中的数据类型 (上)
    今天,我们来讲另一个与I/O操作强相关的代码包bufio。bufio是“bufferedI/O”的缩写。顾名思义,这个代码包中的程序实体实现的I/O操作都内置了缓冲区。bufio包中的数据类型主要有:Reader;Scanner;Writer和ReadWriter。与io包中的数据类型类似,这些类型的值也都需要在初始化的时......
  • Go语言核心36讲 41 | io包中的接口和工具 (下)
    上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型。当然,io代码包中的核心接口不止io.Reader一个。我们基于它引出的一条主线,只是io包类型体系中的一部分。我们很有必要再从另一个角度去探索一下,以求对io包有更加全面的了解。下面的一个问题就与此有关。知识扩展问题:i......
  • Go语言核心36讲 40 | io包中的接口和工具 (上)
    我们在前几篇文章中,主要讨论了strings.Builder、strings.Reader和bytes.Buffer这三个数据类型。知识回顾还记得吗?当时我还问过你“它们都实现了哪些接口”。在我们继续讲解io包中的接口和工具之前,我先来解答一下这个问题。strings.Builder类型主要用于构建字符串,它的指针类型......