动态类加载方式引入第三方资源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 坐标依赖。

你可能感兴趣的:(Java,jar,java)