之前在es聚合导出(不是),Map#merge方法使用 一文里提到过调用jar包里的代码,但是jar包里的代码有问题,需要修改才行的问题。另外之前也跟朋友聊天的时候提到过他调用的jar包里的源码有bug,但是没法修改的事情。今天摸会儿<・)))><<,试用下Javassist(http://www.javassist.org/ )的强大功能,可以动态的直接修改编译后的.class文件,这样的好处是在不修改源码的情况下即可修改现有逻辑。不光是修改,他还能动态创建新的类,并编写相应逻辑,实现对现有代码的零侵入。
同时结合上文Redis结合AOP实现限流注解的开发 中提到的Aspect切面编程相关技术实现更加强大的方法增强效果。
下面就来做一个简单实现试试看,目标仍然是修改jar包里的代码逻辑,首先第一步自己先写个类,并打成jar包。
打包jar包
取一段现有项目里的代码,打成一个包。新建一个项目,按如下结构填入代码,并进行package打包操作
现有分库操作中常用的一个方法,根据订单号模12之后的值进行分库存取操作
public class Mod12 {
public static int mod12(String number){
return modBy(number,12);
}
public static int modBy(String number, int modNum){
BigInteger numBig = new BigInteger(number);
return numBig.mod(BigInteger.valueOf(modNum)).intValue();
}
}
pom.xml文件内容也很干净,如下,分别定义groupId、artifactId、version即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mymod</groupId>
<artifactId>mod12</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
执行package后在项目的target目录下得到一个mod12-1.0-SNAPSHOT.jar文件。
题外话,这样的操作其实也是在日常工作中常用的一种方式。将一些通用的工具类,接口类等独立一个项目,并打包成jar包,再在其他各业务系统中引入这个对应的包调用即可。打一个比方,A系统在集群内提供了一系列rpc服务接口,此时A系统的开发人员将接口单独定义单独抽出来打成一个jar包,其他系统在需要调用A系统的接口的时候引入这个jar包,根据jar包内定义的方法调用A系统的接口。如果A系统某天新增了某个接口,而某个调用方需要用这个新增的接口,则更新下jar包的版本号即可。
Continue reading