从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("}");
}
}