无论是在Java应用中,还是在JavaAgent场景,修复类冲突的逻辑都是一致的,就是避免引入会冲突的类。不同点在于基于JavaAgent技术实现的各式各样的工具,往往都具有业务无关性,在设计和实现之初,并不会为特定的Java应用类型而定制。对于JavaAgent程序而言,需要被字节码增强的应用即是黑盒,所以无法像Java应用那样去梳理依赖结构,排除、升级依赖项,统一进行依赖架构治理。并且JavaAgent往往在运行时使用,所以只能通过保障依赖绝对隔离的方式来避免引入冲突。
为何会产生类冲突,本文重点不在此,简单讲是因为我们在Java中因为重复引入传递依赖、类的加载顺序无法控制等问题,导致引入了相同【类加载器和全限定类名(Fully Qualified Class Name)都相同】但又表现不同【因为类版本不同而导致的类逻辑不一致】的类。所以为了避免冲突,我们就需要避免在运行时引入相同的类,如何让JavaAgent引入的类和宿主完全不相同,从全限定类名和类加载器下手才是根本: