jar包读取变json格式

141 阅读1分钟

从jar包读取类,获取类字段,手动拼接成Json格式

public StringBuilder getRuleExecutionDisplayedOnline(String bomBaseInfoId) throws AdpServiceException {
  //查询是否包含该jar包信息
    BomBaseInfo bomBaseInfo = bomBaseInfoMapper.selectByPrimaryKey(bomBaseInfoId);
    if (bomBaseInfo == null) {
        throw new AdpServiceException("无效的bomBaseInfoId");
    }
    StringBuilder json = new StringBuilder();
    BomModel validBomModel = bomModelMapper.getValidModelById(bomBaseInfoId);
    if (validBomModel == null || validBomModel.getBomFileContent() == null) {
        return null;
    }
    //读取jar包二进制 转换成 类文件
    Class[] classes = BomModelUtil.convertToClasses(validBomModel.getBomFileContent(), new Class[]{Bom.class}, "");
    //主bom类
    Class primaryClass = BomModelUtil.getPrimaryClazz(classes);
    if (primaryClass == null) {
        return null;
    }
    try {
        json.append("{");
        pickupJson(primaryClass, json, primaryClass.getClassLoader());
        json.append("}");
    } catch (Exception e) {
        throw new AdpServiceException("类转换异常");
    }
    return json;
}
private void pickupJson(Class<?> clazz, StringBuilder json, ClassLoader classLoader) throws ClassNotFoundException {
    //获取类字段
    Field[] fields = clazz.getDeclaredFields();
    int length = fields.length;
    if (fields.length == 0) {
        return;
    }
    for (Field field : fields) {
        String name = field.getName();
        Class<?> type = field.getType();

        if (name == null) {
            json.append("""");
        }

        json.append(""").append(name).append(""").append(":");

        //说明是加载过的,先处理字段上的对象信息
        //字段为list的
        if (type.equals(List.class)) {
            //实际类型
            Class actualType = (Class) ((ParameterizedTypeImpl) field.getGenericType()).getActualTypeArguments()[0];
            type = actualType;
            json.append("[");
            isClass(type, classLoader, json);
            json.append("]");
        } else if (type.getClassLoader() instanceof JarBytesClassLoader) {
            isClass(type, classLoader, json);
        } else {
            if (type.getName().equals("java.lang.Integer") || type.getName().equals("java.lang.Double")) {
                json.append("0");
            } else {
                json.append("""");
            }
        }
        if (length - 1 > 0) {
            json.append(",");
            length--;
        }
    }
}
public void isClass(Class<?> type, ClassLoader classLoader, StringBuilder json) throws ClassNotFoundException {
    if (type.getClassLoader() instanceof JarBytesClassLoader) {
        Class<?> childClazz = classLoader.loadClass(type.getName());
        json.append("{");
        pickupJson(childClazz, json, classLoader);
        json.append("}");
    }
}