Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱,具体可以访问其 官网。
watch和trace是arthas诊断中对于开发人员解决线上问题最常用的功能。在定位过程中经常会遇到重载方法如何判断。要解决这个问题,首先要了解arthas的两个重要内容:表达式核心变量以及ongl表达式。
arthas 表达式核心变量
public class Advice {
private final ClassLoader loader;
private final Class<?> clazz;
private final ArthasMethod method;
private final Object target;
private final Object[] params;
private final Object returnObj;
private final Throwable throwExp;
private final boolean isBefore;
private final boolean isThrow;
private final boolean isReturn;
// getter/setter
}
ongl表达式
没有学习过ognl,使用多年的spring 一定知道他的el 表达式,el 表达式中也有一种概念叫做Context 上下文和表达式 。如下所示,因为有了simple这个上下文才能解析 "booleanList[0]" 这个脚本的含义~ 这个很熟悉,很好理解,那么ognl 表达式一样不难了。
class Simple {
public List<Boolean> booleanList = new ArrayList<Boolean>();
}
Simple simple = new Simple();
simple.booleanList.add(true);
StandardEvaluationContext simpleContext = new StandardEvaluationContext(simple);
// false is passed in here as a string. SpEL and the conversion service will
// correctly recognize that it needs to be a Boolean and convert it
parser.parseExpression("booleanList[0]").setValue(simpleContext, "false");
// b will be false
Boolean b = simple.booleanList.get(0);
基于上述概念,重载方法如何判断,无非就是评估条件? 参数的个数、第一个参数是什么?返回值的类型等等都可以作为你评估的条件。如下的watch 前面的一段是观察的值、后面这一段是表达式评估 ,满足了条件才执行。
入参长度大于0
watch packagename.ClassName methodName '{params,returnObj,throwExp}' -n 5 -x 3 'params.length >0'
返回值为String且长度大于5
watch packagename.ClassName methodName '{params,returnObj,throwExp}' -n 5 -x 3 'returnObj instanceof java.lang.String && returnObj.length>5'