修改源码的业务场景
在java代码编写的时候,引入各种开发现成的开发包。由于源码中出现各种不满足我们当前业务的逻辑,
但是我们并不想整体架构进行变更,这个时候就可以通过修改源码来实现修改部分功能来实现代码的修改。
修改源码方法:
- 找到报错的核心的类找到class类
- 反编译为java文件并修改报错的地方
- 在工程中创建为相同全类名的java文件
- 将错误的地方改为自己想改的内容运行项目
举例说明
我们项目中用到了阿里开源的datax插件来进行数据交换,mysqlwrite 只要求insert权限即可
但是我们只给那个用户只有insert插入权限的时候报错。查看源码时发现
插入的时候,需要查询原来表的列的数目导致只有写权限的时候会抛出异常。我们分析了段源码之后,决定对这段代码进行改造。换一种不需要查询权限就可以得表的列名
mysql>select COLUMN_NAME from information_schema.COLUMNS where table_name = '{表名}' and table_schema = '{库名}';
刚才出现问题的类的全类名是com.alibaba.datax.plugin.rdbms.util.DBUtil
所以我们在java 目录下逐级建了com/alibaba/datax/plugin/rdbms/utils目录
(ps 用git客户端mkdir -p com/alibaba/datax/plugin/rdbms/utils 可以一次性建完该目录)
将反编译的java 修改报错信息。并将查询语句修改完。运行测试类,没有出现问题。至此datax的Dbutils 的源码改造完成
源码改造的理论依据
jvm的双亲委派机制【传送门】