有问题直接加我微信wj983433479 或者 扫码添加钉钉群 32102545 沟通
如果你喜欢这款插件,欢迎给身边的小伙伴推荐,给个github star,谢谢
目前Arthas 官方的工具还不够足够的简单,需要记住一些命令,特别是一些扩展性特别强的高级语法,比如ognl获取spring context 为所欲为,watch、trace 不够简单,需要构造一些命令工具的信息,因此只需要一个能够简单处理字符串信息的插件即可使用。当在处理线上问题的时候需要最快速、最便捷的命令,因此Idea arthas 插件还是有存在的意义和价值的。
支持的功能都是平时处理最常用的一些功能,一些快捷的链接,在处理紧急问题时候不需要到处查找,都是一些基本的功能,自动复制到剪切板中去,方便快捷。
watch StringUtils uncapitalize '{params,returnObj,throwExp}' -n 5 -x 3
trace StringUtils uncapitalize -n 5
必须要获取,不然会找不到classload,arthas 官方获取问题系统的classload,spring 项目应该无法获取到这个class的信息,因此首先执行一下这个命令
sc -d StringUtils
ognl -x 3 '@StringUtils@uncapitalize(" ")' -c 8bed358
实际上就是根据当前的spring项目中的获取静态的spring context这样可以直接根据这个context直接获取任何的Bean方法,一般在Java后端服务中都有这样的Utils类,因此这个可以看为一个常量! 可以参考:arthas idea demo 有了这个,我们可以跟进一步的进行数据简化,由于在idea这个环节中,可以获取方法参数,spring bean的名称等等,非常的方便。
package com.wangji92.arthas.plugin.demo.common;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 提供给arthas ognl 获取context的信息
*
* @author 汪小哥
* @date 30-28-2020
*/
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
context = ctx;
}
}
这里的策略和static ognl 一样的,本质还是ognl的调用。
ognl -x 3 '#springContext=@applicationContextProvider@context,#springContext.getBean("arthasInstallCommandAction").actionPerformed(new com.intellij.openapi.actionSystem.AnActionEvent())' -c desw22
public static String getDefaultString(PsiType psiType) {
String result = " ";
String canonicalText = psiType.getCanonicalText();
//基本类型 boolean
if (PsiType.BOOLEAN.equals(psiType) || canonicalText.equals("java.lang.Boolean")) {
result = "true";
return result;
}
//基本类型 String
if (canonicalText.endsWith("java.lang.String")) {
result = "\" \"";
return result;
}
if (PsiType.LONG.equals(psiType) || "java.lang.Long".equals(canonicalText)) {
result = "0L";
return result;
}
if (PsiType.DOUBLE.equals(psiType) || "java.lang.Double".equals(canonicalText)) {
result = "0D";
return result;
}
if (PsiType.FLOAT.equals(psiType) || "java.lang.Float".equals(canonicalText)) {
result = "0F";
return result;
}
//基本类型 数字
if (PsiType.INT.equals(psiType) || canonicalText.equals("java.lang.Integer")
||
PsiType.BYTE.equals(psiType) || canonicalText.equals("java.lang.Byte")
||
PsiType.SHORT.equals(psiType) || canonicalText.equals("java.lang.Short")) {
result = "0";
return result;
}
//常见的List 和Map
if (canonicalText.startsWith("java.util.")) {
if (canonicalText.contains("Map")) {
result = "#{\" \":\" \"}";
return result;
}
if (canonicalText.contains("List")) {
result = "{}";
return result;
}
}
//原生的数组
if (canonicalText.contains("[]")) {
result = "new " + canonicalText + "{}";
return result;
}
//不管他的构造函数了,太麻烦了
result = "new " + canonicalText + "()";
return result;
}
安装脚本,可以一键的通过as.sh 进行执行
curl -sk https://arthas.aliyun.com/arthas-boot.jar -o ~/.arthas-boot.jar && echo "alias as.sh='java -jar ~/.arthas-boot.jar --repo-mirror aliyun --use-http 2>&1'" >> ~/.bashrc && source ~/.bashrc && echo "source ~/.bashrc" >> ~/.bash_profile && source ~/.bash_profile