您好,欢迎来到站长目录(28sn.com)!


如何快速熟悉一个项目

来源:网络整理 浏览:129次 时间:2021-01-13

import com.google.common.reflect.TypeToken;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.commons.lang3.reflect.MethodUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

@RestController
public class EchoController implements ApplicationContextAware {

private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    this.applicationContext = applicationContext;}

//applicationContext中的对象反射调用,data为请求参数(LinkedHashMap的json格式,其中key为类型的全限定名)
@RequestMapping(method = RequestMethod.POST, value = "/invoke")
public String invoke(String obj, String methodName, @RequestParam(value = "data", required = false) String data) {
try {
Object object = getObj(applicationContext, obj);
LinkedHashMap<String, Object> linkedHashMap = StringUtils.isBlank(data) ?
new LinkedHashMap<>() : GSON.fromJson(data, new TypeToken<LinkedHashMap<String, Object>>() {
}.getType());
Object[] args = linkedMap2args(linkedHashMap);
try {
Object invoke = MethodUtils.invokeMethod(object, methodName, args);
return GSON.toJson(invoke);
} catch (Exception e) {
Method[] declaredMethods = object.getClass().getDeclaredMethods();
for (Method m : declaredMethods) {
if (m.getName().equals(methodName)) {
m.setAccessible(true);
Object invoke = m.invoke(object, args);
return GSON.toJson(invoke);
}
}
for (Class parentClass = object.getClass().getSuperclass(); parentClass != null; parentClass = parentClass.getSuperclass()) {
Method[] parentMethods = parentClass.getDeclaredMethods();
for (Method m : parentMethods) {
if (m.getName().equals(methodName)) {
m.setAccessible(true);
Object invoke = m.invoke(object, args);
return GSON.toJson(invoke);
}
}
}
throw new RuntimeException("未找到方法:" + methodName);
}
} catch (Exception e) {
return e.getMessage();
}
}

private Object[] linkedMap2args(LinkedHashMap<String, Object> linkedHashMap) {    if (CollectionUtils.isEmpty(linkedHashMap)) {        return null;    } else {        List<Object> args = new ArrayList<>();        linkedHashMap.entrySet().forEach(stringObjectEntry -> {            String type = stringObjectEntry.getKey().split("_")[0];            Class<?> clazz = null;            try {                clazz = Class.forName(type);            } catch (ClassNotFoundException e) {                throw new RuntimeException(e);            }            Object arg = GSON.fromJson(GSON.toJson(stringObjectEntry.getValue()), clazz);            args.add(arg);        });        return args.toArray();    }}

//applicationContext中的对象属性访问,例如bean.field1.field2.password@RequestMapping("/getObj")
br/>@RequestMapping("/getObj")
Object object = getObj(applicationContext, obj);
return obj2String(object);
}

public static String obj2String(Object o) {    if (String.class.equals(o.getClass())            || Enum.class.equals(o.getClass())            || Date.class.equals(o.getClass())            || Long.class.equals(o.getClass())            || long.class.equals(o.getClass())            || Integer.class.equals(o.getClass())            || int.class.equals(o.getClass())            || Double.class.equals(o.getClass())            || double.class.equals(o.getClass())            || Float.class.equals(o.getClass())            || float.class.equals(o.getClass())            || Short.class.equals(o.getClass())            || short.class.equals(o.getClass())            || Boolean.class.equals(o.getClass())            || boolean.class.equals(o.getClass())    ) {        return String.valueOf(o);    } else {        StringBuilder sb = new StringBuilder();        Field[] allFields = FieldUtils.getAllFields(o.getClass());        for (Field field : allFields) {            sb.append(field.getName());            sb.append("\n");        }        return sb.toString();    }}private static Object getObj(ApplicationContext ac, String propAccessChain) {    Object o = null;    if (StringUtils.isBlank(propAccessChain)) {        return "参数不能为空";    }    String[] split = propAccessChain.split("\\.");    try {        o = ac.getBean(split[0]);    } catch (Exception e) {        System.out.println("获取对象" + split[0] + "失败");        return "对象" + split[0] + "不存在";    }    int index = propAccessChain.indexOf(".") + 1;    return index > 0 ? getObj(o, propAccessChain.substring(index)) : o;}private static Object getObj(Object o, String propAccessChainFromObj) {    String[] split = propAccessChainFromObj.split("\\.");    for (String next : split) {        try {            if (next.contains("(") && next.contains(")")) {                try {                    String desc = next.substring(0, next.indexOf("("));                    String key = next.substring(next.indexOf("(") + 1, next.indexOf(")"));                    Object listOrMap = FieldUtils.readField(o, desc, true);                    if (Map.class.isAssignableFrom(listOrMap.getClass())) {                        o = ((Map) listOrMap).get(key);                    } else if (List.class.isAssignableFrom(listOrMap.getClass())) {                        o = ((List) listOrMap).get(Integer.parseInt(key));                    } else {                        Object[] cast = Object[].class.cast(listOrMap);                        o = cast[Integer.parseInt(key)];                    }                } catch (Exception e) {                    System.out.println("获取属性" + next + "失败");                }            } else {                try {                    o = FieldUtils.readField(o, next, true);                } catch (Exception e) {                    System.out.println("获取属性" + next + "失败");                }            }        } catch (Exception e) {            throw new RuntimeException("获取属性" + next + "失败");        }    }    return o;}

}

推荐站点

  • 我爱发烧音乐我爱发烧音乐

    我爱发烧音乐囊括了从流行音乐到古典音乐多个类型的音乐作品,专栏推荐最新的音乐,提供音乐排名榜单!可供免费线上收听音乐,歌曲流畅,音效极佳! 网站提供的钢琴以及二胡专栏,可供收听者,陶冶情操,改善心情,是难得的轻音乐典藏!

    www.520fs.com
  • 世纪音乐网世纪音乐网

    世纪音乐网是专业的在线音乐试听MP3下载网站。歌曲总计30余万首,收录了网上最新歌曲和流行音乐,DJ舞曲,非主流音乐,经典老歌,劲舞团歌曲,搞笑歌曲,儿童歌曲,英文歌曲等。是您上网听歌的最佳网站。

    www.ssjj.com
  • 怒江大峡谷网怒江大峡谷网

    怒江大峡谷网内容包括:新闻、要闻、怒江报、视频、文化、民俗、人文、音乐、政务、公告、政策等地方信息。

    www.nujiang.cn
  • 杭州网杭州网

      杭州网是杭州地区唯一的新闻门户网站,由中共杭州市委宣传部、杭州日报报业集团和杭州广播电视集团共同组建的杭州网络传媒有限公司运营。

    www.hangzhou.com.cn
  • 深圳在线深圳在线

      深圳在线 www.szol.net是深圳本地最大、最早的地方生活资讯网站之一,网站名“深圳在线www.szol.net”由南方报业传媒集团编辑委员会总编辑、南方日报社总编辑、南方都市报总编辑、南方书画院名誉院长王春芙亲笔题名,深圳在线www.szol.net团队与深圳热线www.szonline.net、奥一网www.oeeee.com都源于全国最早成立于1996年的知名网络公司——深圳万用网。

    www.szol.net

鄂公网安备 42062502000001号