动态类加载方式引入第三方资源jar包
一,背景说明
一般情况,引入第三方jar包的操作:
1,上传到公司私库;
2,pom引入坐标;
但是这次需要动态类加载方式使用jar包资源;
1,这是一个Saas系统,涉及到多租户,只有其中一个租户要求需要使用到这个资源,考虑环境隔离,资源安全性,由此使用动态类加载,毕竟这种方式用起来复杂且不便,不到特殊时候不需要使用,但还是记录一下使用方式;
二,使用方式
1,将jar包资源上传到服务器指定位置
此处我的位置
/opt/data/lib/bcprov-jdk15on-1.68.jar
/opt/data/lib/SM4Util-2.1.2-RELEASE.jar
2,使用
public static String decryptData(String body, String secretKey, String iv) throws Exception {List<String> jarPath = new ArrayList<>();jarPath.add("/opt/data/lib/bcprov-jdk15on-1.68.jar");jarPath.add("/opt/data/lib/SM4Util-2.1.2-RELEASE.jar");CommonProInvoker commonProInvoker = new CommonProInvoker(jarPath);Class<?> loadClass = commonProInvoker.loadClass("com.security.demo.SM4Utils");Object sm4 = loadClass.getConstructor().newInstance();ReflectUtil.setFieldValue(sm4, "secretKey", secretKey);ReflectUtil.setFieldValue(sm4, "iv", iv);ReflectUtil.setFieldValue(sm4, "hexString", true);Method decryptDataCbc = commonProInvoker.getMethod("com.security.demo.SM4Utils", "decrypt01", String.class);String dataCbc = decryptDataCbc.invoke(sm4, body).toString();return dataCbc;}
当然,如果使用第一种方式代码就变得简单多了,
public static String decryptData(String body, String secretKey, String iv) throws Exception {SM4Utils sm4 = new SM4Utils();sm4.SetSecretKey(secretKey);sm4.setHexString(true);sm4.setIv(iv);String data = sm4.decrypt01(body);return data ;}
三,总结
使用动态类加载方式是合理的,尤其是在以下场景:
1,加密库需要严格物理隔离。
2,系统需要支持多种加密算法的热插拔。
3,环境限制导致无法使用标准依赖管理工具。
但这种方式也带来了维护复杂度和性能开销,需要权衡利弊。在安全性要求不高的常规项目中,建议优先使用 Maven/Gradle 坐标依赖。