java修改第三方jar包中的代码

17 篇文章 29 订阅
订阅专栏
4 篇文章 1 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏

修改jar包源码

今天在学习java的sychronized偏向锁的时候,看了一篇视频教程

https://www.bilibili.com/video/BV16J411h7Rd?p=83&spm_id_from=pageDriver

教程中老师引用了一个第三方的jar包(jol-core),maven坐标如下,来打印锁对象的Mark Word字节码,从而更直观察地多线程下加偏向锁的情况。

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>

这些都是挺常规的操作,接着老师的骚操作来了,扩展了jar包里面的方法。弹幕里面都是惊呼声,老师改了jar包,我们学习者没法复现了呀。

我寻思是不是用了动态代理啥的做的,可是一看他调用的方法是ClassLayout.parseInstance(dog).toPrintableSimple(),这个类的构造方法是私有的,另外内部都是静态方法。作为一个工具类扩展 出来的,那动态代理就行不通了。toPrintableSimple()这个方法是jar包中不存在的,也就是说这个方法是老师自己写的。

抱着刨根问底的心态,我尝试去下载源码查看ClassLayout.toPrintable()这个方法,代码大概100多行的样子,就是基于这个方法扩展一个toprintableSimple()方法,然后重新编译项目,找到ClassLayout.class字节码,然后把这个文件去替换官方jar包中的这个类,再去项目里面一刷新,最后一运行,nice搞定,跟老师的一样炫酷。

下面我把这个改官方jar包代码的骚操作告诉你,分为以下几个步骤:

一、实现步骤

1. 下载对应jar包的源码

在idea右侧maven导航栏里面找到对应的依赖项,然后右键下载源代码

image-20220312151940098

2. 解压源码然后导入到idea里面

在左侧项目的外部库下面展开对应jar包,然后右键选打开于Explorer

image-20220312152223157

在系统文件浏览器里面再用压缩工具解压源代码

image-20220312152454482

打开解压后的目录跟我们平时看到的maven项目不太一样,这是因为打成jar包以后,文件目录会变

image-20220312152726466

去idea新建一个项目,就跟这个文件夹同名好了jol-core-0.16-sources,将刚才解压的目录下面的代码放到maven指定的位置

  • org放到项目的main/java
  • META-INF放到项目的resources目录下
  • META-INF\maven\org.openjdk.jol\jol-core下的pom.xml放到项目根目录下

刷新maven项目

这里如果编译代码的话会报一个错误,提示sun.misc不存在,经过搜索资料得知是jdk版本过高导致的,在项目结构里面改成jdk 8即可

image-20220312153339053

3. 修改源代码

编辑org.openjdk.jol.info.ClassLayout类,

先按Ctrl + o 看一下ClassLayout中的方法,只有toPrintable()和toPrintable(Object)方法,

image-20220312154512801

我们参考着写toPrintableSimple()toPrintableSimple()方法

public String toPrintableSimple() {
    return toPrintableSimple(classData.instance());
}

public String toPrintableSimple(Object instance) {
    StringBuilder sb = new StringBuilder();
    String markStr = "";
    String remind = "";

    int markSize = model.markHeaderSize();

    int markOffset = 0;

    if (instance != null) {
        VirtualMachine vm = VM.current();
        if (markSize == 8) {
            long mark = vm.getLong(instance, markOffset);
            markStr = Long.toBinaryString(mark);
            remind = parseMarkWord(mark);
        } else if (markSize == 4) {
            int mark = vm.getInt(instance, markOffset);
            markStr = Integer.toBinaryString(mark);
            remind = parseMarkWord(mark);
        }
    }

    // 高位补0
    int i = 1;
    for (; i <= 8 * markSize - markStr.length(); i++) {
        sb.append('0');
        if (i % 8 == 0) {
            sb.append(" ");
        }
    }
    for (; i <= 8 * markSize; i++) {
        sb.append(markStr.charAt(i - (8 * markSize - markStr.length()) - 1));
        if (i % 8 == 0) {
            sb.append(" ");
        }
    }

    sb.append(remind);

    return sb.toString();
}

Ctrl + F9重新编译代码

4. 替换jar包中的对应的class文件

项目重新编译后,去target目录下,找到org.openjdk.jol.info.ClassLayout对应的class文件,复制,用压缩软件,我用的WinRAR,打开maven仓库中对应的jar包,进到org\openjdk\jol\info粘贴,这就完成了替换。

image-20220312154200493

然后去之前的项目中试着调用toPrintableSimple()看看吧,调用成功!

在这里插入图片描述

二. 导出jar包

如果不想污染官方的jar包,也可以自己导出jar包,具体方法很简单,去idea右侧maven导航栏的项目的生命周期里面install即可,jar包会自动导出到本地的maven仓库中。

注:1. 需要把pom.xml中的java-doc和license的plugin注释掉,否则会报错; 2.需要把在pom.xml中指定version,否则会覆盖官方的jar包

在这里插入图片描述

打包后,去maven仓库查看

image-20220312163033647

尝试在项目中引入,不报错且能正常运行

在这里插入图片描述

java如何修改sdk代码,如何快速修改sdk jar包的class文件
weixin_42467508的博客
03-12 1063
有时候可能会遇到需要修改依赖jar包某些类的某些方法的需求,比如有些第三方sdk会出现空指针等异常导致应用程序崩溃,但是想等第三方更新sdk来解决时间又来不及,我们可以修改class文件加个异常捕获来避免crash出现。最近工作遇到一个问题,需要抓包分析某个sdk的网络请求,经过一番折腾终于可以抓包了,但是发现网络请求总是提示ssl异常,去分析sdk的源码发现,改sdk使用okhttp进行网络...
java没有源码,修改jar包代码
bwcx_dabai的博客
06-06 928
直接在idea下载jclasslib插件,并使用这个插件就可以直接修改jar包的常量(比如字符串等等),不需要使用代码来操作,操作如下。有的建议将反编译后的代码拷贝一份,创建相同的包路径,然后重新创建java类,编译后覆盖到jar包。有的建议通过jclasslib bytecode viewer,查看常量的位置,并用代码进行修改。2.在方法,找到要修改的常量的地址;(注意要找到常量的真实地址,不要把引用给改了)1.选jar包的class文件,点击下图按钮,打开操作页面。
修改jar的三种方法(反编译jar
whojoe的博客
07-27 1万+
修改jar的三种方法(反编译jar)工具准备三种方式1.使用fernflower反编译之后再编译2.使用javassist动态修改class3.通过引入原来的jar包修改代码(推荐)总结 工具准备 相同大版本的jdk idea fernflower.jar javassist.jar jd-gui 三种方式 1.使用fernflower反编译之后再编译 把要反编译的.jar修改成.zip java -jar fernflower.jar classes.zip zzCode/ 即可得到全为java的ja
jar包源码修改(1)
最新发布
2401_84046876的博客
04-30 323
现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门。
jar包内容修改
04-18 4524
在windows本地修改已打包的jar内容
jar包源码修改
热门推荐
小杨互联网
03-18 1万+
jar包源码修改 我相信大家在做项目的时候有时候看源码,或者想改源码代码的时候,一定是修改不了滴,今天在这里就告诉大家如何修改源码里面的代码并且从新打成jar包。 一,反编译首先是要下个反编译工具。网上有很多啊Jadclipse,XJad,Java Decompiler我这里用的是JD-GUI(直接下载) 链...
jar 更新 jar包内的 class,以及如何修改class
Don't Look Down的博客
07-23 2001
二、代码直接修改Jar包内的Class,(这种方式要明确知道自己在干什么)随便一个java工程引入。一、提取Jar 内文件。
Java Maven 修改第三方库源码
Coder_Joker的博客 joke a joker
11-05 3145
背景 修改fabric-sdk-java 源码,然后涉及到grpc,需要修改grpc的源码 工具 jd-gui idea 步骤 创建一个新的maven工程,maven工程的名字任意 用jd-gui打开所依赖的第三方库的源码,如grpc-core 找到具体的class文件,ctrl+all 在新创建的maven工程,创建package(要与grpc-core所修改的类的package一致) 创建一个相同名称的类,粘贴进去,然后修改,使得没有错误(当然这个maven工程的pom包也
修改Jar包的源代码只读文件
c_v_sCtrl的博客
03-14 2022
请注意,如果你要将修改后的 jar 包提供给其他人使用,需要确保其与原来的 jar 包具有相同的文件结构和文件名。否则,可能会出现运行时错误。请注意,如果你要将修改后的 jar 包提供给其他人使用,需要确保其与原来的 jar 包具有相同的文件结构和文件名。将解压缩后的文件夹作为一个普通的项目导入到 IntelliJ IDEA 。使用压缩软件重新将文件夹打包成 jar 包,替换原来的 jar 包。在任意位置新建一个空文件夹,例如 my-jar。将你想要编辑的 jar 包复制到该文件夹
IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)
08-18
主要介绍了IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
在可执行jar载入第三方jar的几个解决方法
09-11
开发完毕,部署的时候,将开发的class打成一个可执行jar包,会发现通过Class.forName(String classname) 或ClassLoader.getSystemClassLoader().loadClass(String classname)来动态载入存在于第三方jar包的class会抛...
C#调用java类、jar包方法
01-27
C#调用java类、jar包方法C#调用java类、jar包方法C#调用java类、jar包方法C#调用java类、jar包方法C#调用java类、jar包方法。
aop面向切面需要的jar包
08-16
在使用spring的aop功能时,这两个jar是必须的,否则会报错,如下: Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net....
JAVA_API1.6文档(文)
04-12
javax.sql.rowset.spi 第三方供应商在其同步提供者的实现必须使用的标准类和接口。 javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing....
jSqlBox:jSqlBox是Java ORM工具(注意
05-28
jSqlBox是一个全功能开源Java数据库持久层工具,在架构、功能、易用性等方面都不输于其它持久层工具,可以说,只要是与数据库操作相关的功能,jSqlBox都已具备,如DDL操作、分页、分库分表、声明式事务、分布式事务...
java api最新7.0
10-26
javax.sql.rowset.spi 第三方供应商在其同步提供者的实现必须使用的标准类和接口。 javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border ...
jar包源码修改Java入门教程
2301_79058150的博客
03-28 723
阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。2、Redis学习笔记及学习思维脑图。
修改第三方jar包class文件并重新打包
m0_69671411的博客
05-17 2358
最近有个需求是对一个第三方jar包的class文件进行修改后重新发行,找了很多文章博客尝试下来都有点问题,最后摸索着还是写出来了,也在这里记录一下。
Java修改Jar的源码,并上传Nexus私有仓库,替换jar版本
Yal_insist的博客
11-04 1690
Java修改Jar的源码,并上传Nexus私有仓库,替换jar版本
springmvc扫描第三方jar包的bean
09-01
在Spring MVC,要扫描第三方JAR包的bean,可以按照以下步骤进行操作: 1. 配置Spring配置文件:在Spring配置文件,需要添加扫描第三方JAR包的配置项。可以通过使用<context:component-scan>标签来扫描指定包下的类,并将其作为bean进行注册。例如,可以配置如下: ```xml <context:component-scan base-package="com.your.package" /> ``` 这样Spring就会自动扫描并注册该包下的所有类作为bean。 2. 添加第三方JAR包的依赖:在项目的pom.xml(如果是Maven项目)或build.gradle(如果是Gradle项目)文件,添加第三方JAR包的依赖。确保该JAR包已经被正确引入到项目。 3. 使用第三方JAR包的bean:在业务代码,可以通过@Autowired或@Resource等注解将第三方JAR包的bean注入到需要使用的地方。例如: ```java @Autowired private ThirdPartyBean thirdPartyBean; ``` 这样就可以直接使用第三方JAR包定义的bean了。 需要注意的是,为了能够成功扫描第三方JAR包的bean,确保包含bean的JAR包已经被正确引入,并且配置文件的扫描路径正确。另外,还需要遵循Spring的bean的装配规则,确保注入的bean可以正常使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 黑马程序员Spring视频教程,全面深度讲解spring5底层原理 学习笔记 29372
  • 解决XShell和Xftp远程连接Ubuntu失败,报找不到匹配的key exchange算法的错误 27877
  • 解决vue中使用scss时,依赖node-sass和sass-loader的版本问题: 20969
  • 黑马程序员SpringBoot2全套教程学习笔记 17695
  • word文档中全选所有图片并修改格式 16685

分类专栏

  • 微服务 4篇
  • 随笔 1篇
  • 工具使用 2篇
  • vscode插件开发 1篇
  • spring 1篇
  • MySQL数据库 3篇
  • Java 基础 2篇
  • maven项目配置 4篇
  • 项目简介和效果预览 5篇
  • Windows操作技巧 2篇
  • matlab 4篇
  • 机器学习
  • Python 1篇
  • 数据结构和算法 1篇
  • java swing 2篇
  • Web前端 2篇
  • java 新特性学习 1篇
  • java多线程与并发编程 1篇
  • 期末考试复习总结 1篇
  • java并发编程 1篇
  • git
  • matlab GUI编程 1篇
  • Linux 17篇
  • centos 2篇
  • ubuntu 11篇
  • Java EE 17篇
  • 地图 1篇

最新评论

  • word文档中全选所有图片并修改格式

    @@努力学习: 搞定了,很棒,感谢大佬!

  • 黑马程序员SpringBoot2全套教程学习笔记

    人间失格2: woc,就是来找sql的,哥们太强了

  • word文档中全选所有图片并修改格式

    xiaowuguihututu: CTRL+E用不了是为什么喔

  • word文档中全选所有图片并修改格式

    2301_81876319: 我的word怎么没有选中多个对象

  • 依赖冲突报错Caused by: java.lang.ClassNotFoundException: org.apache.dubbo.config.spring.util.BeanRegistrar

    Aimyone: 跟博主一样的问题,看了依赖,发现依赖重复了,删了一个就好了

大家在看

  • BGP的属性1
  • SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级讲解,耐心看完) 1014
  • 学习c++的第十二天 小写变大写——ASCLL码与字符型
  • 论文阅读:All-In-One Image Restoration for Unknown Corruption 349
  • GIS数据快捷共享发布工具使用时注意事项 194

最新文章

  • win10实现非标(非445)端口访问samba服务
  • linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上
  • vscode插件开发入门案例-一键删除js文件中的某个函数
2023年2篇
2022年11篇
2021年15篇
2020年22篇
2019年9篇
2018年1篇

目录

目录

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源金太狼的幸福生活电视剧贵金属交易软件英雄无敌之新势力崛起青岛电视台直播花都最强医神金鼠起名注意事项李礼辉新生儿起名大全男宝宝去哪儿机票品牌 起名特朗普问自己是最帅美国总统吗100分起名子合作社名称重新起名ringtones金华起名存款利率怎么算姓氏薛起名男孩子起点白金作家排名文华财经下载猪宝贝起乳名复仇者联盟4百度云周易起名专家网激情深爱网酷猫影院一点点加盟测算起名p2p网贷东方国足对卡塔尔狐仙电影一起发名录淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化