阅读目录
- 前言
- 效果展示:
- api中大致的步骤
- 步骤1:编译java文件为class文件
- 步骤2:定义一个类加载器,加载为Class对象
- 步骤3:反射class,生成对象
- 步骤4:对autowired field,注入bean
- 步骤5:万事俱备,只欠东风
- 完整代码
- 总结
前言
这篇其实是对一年前的一篇文章的补坑。
@Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码
当时,就是在spring mvc应用里定义一个api,然后api里,进行如下定义:
@Autowired
private IRedisCacheService iRedisCacheService;
/**
* 缓存获取接口
* @param cacheKey
*/
@RequestMapping("getCache.do")
public String getCache(@RequestParam String cacheKey){
String value = iRedisCacheService.getCache(cacheKey);
System.out.println(value);
return value;
}
大家看上面的注释,就是读取文件流,这个文件流里包含了我们要远程执行的代码;className和methodName,分别指定这个文件的类名和debug方法的方法名。
如果大家看得一脸懵的话,也没关系,下面我基于此次改版升级后的应用给大家举个例子。
假设我有下面这样一个controller。
/**
* desc:
*
* @author : xxx
* creat_date: 2019/6/18 0018
* creat_time: 10:17
**/
@Service
@Slf4j
public class IRedisCacheServiceImpl implements IRedisCacheService {
Random random = new Random();
@Override
public String getCache(String cacheKey) {
String target = null;
// 1
String count = getCount(cacheKey);
// ----------------------后面有复杂逻辑--------------------------
if (Integer.parse