html网站素材网,怎么给网站做外链,创鑫时代广告公司简介,网站建设流程周期文章目录 Arthas常见使用姿势官网基本命令通用参数解释表达式核心变量说明常用命令一些常用特殊案例举例其他技巧关于OGNLOGNL的常见使用OGNL的一些特殊用法与说明OGNL内置的虚拟属性OGNL的个人思考OGNL的杂碎#xff0c;收集未做验证 Arthas常见使用姿势
官网
https://arth… 文章目录 Arthas常见使用姿势官网基本命令通用参数解释表达式核心变量说明常用命令一些常用特殊案例举例其他技巧关于OGNLOGNL的常见使用OGNL的一些特殊用法与说明OGNL内置的虚拟属性OGNL的个人思考OGNL的杂碎收集未做验证 Arthas常见使用姿势
官网
https://arthas.aliyun.com/doc/
基本命令
java -jar arthas-boot.jar通用参数解释
-n 限制打印的条数如程序执行中可能有些方法会疯狂打印。
-i 设置打印间隔时间单位毫秒
-x 属性遍历深度默认为1。表达式核心变量说明
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;
} 变量名变量解释loader本次调用类所在的 ClassLoaderclazz本次调用类的 Class 引用method本次调用方法反射引用target本次调用类的实例params本次调用参数列表这是一个数组如果方法是无参方法则为空数组returnObj本次调用返回的对象。当且仅当 isReturntrue 成立时候有效表明方法调用是以正常返回的方式结束。如果当前方法无返回值 void则值为 nullthrowExp本次调用抛出的异常。当且仅当 isThrowtrue 成立时有效表明方法调用是以抛出异常的方式结束。isBefore辅助判断标记当前的通知节点有可能是在方法一开始就通知此时 isBeforetrue 成立同时 isThrowfalse 和 isReturnfalse因为在方法刚开始时还无法确定方法调用将会如何结束。isThrow辅助判断标记当前的方法调用以抛异常的形式结束。isReturn辅助判断标记当前的方法调用以正常返回的形式结束。
默认对象即未设置观察表达式时的默认表达式
{params, target, returnObj}常用命令
# ognlognl java.lang.Systemout.println(hello)# watchwatch demo.MathGame primeFactors -x 2# 默认观察 {params, target, returnObj}# tracetrace java.util.Collections sort -n 5 --skipJDKMethod false# 重载使用watch Test hello params params[0].class.namejava.lang.Integerwatch Test hello params params.length2returnObj instanceof java.lang.String# stack 输出当前方法被调用的调用路径stack site.tkgup.Demo test -n 5 # vmtoolvmtool --action getInstances --className site.tkgup.HelloWorld --express instances[0].container -x 3# jad 反编译器java decompiler java可做些热替换操作jad --source-only com.example.Demo /tmp/Demo.java# 1、jad得到原文件jad site.tkgup.Demo# 2、使用vi/vim修改# 3、使用 mc 进行编译mc /tmp/Demo.java# 4、使用 redefine/retransform 进行加载redefine /tmp/Demo.class
一些常用特殊案例举例
#1、观察 函数调用 返回时watch demo.MathGame primeFactors -x 2# -x 表示遍历深度可以调整来打印具体的参数和结果内容默认值是1# 观察表达式默认值是{params, target, returnObj}#2、观察 函数调用 入口时watch demo.MathGame primeFactors {params,returnObj} -x 2 -b#3、同时观察 函数调用 入口时和返回后watch demo.MathGame primeFactors {params,target,returnObj} -x 2 -b -s -n 2# -n 2表示只执行两次#4、条件表达式watch demo.MathGame primeFactors {params[0],target} params[0]0#5、观察异常信息watch demo.MathGame primeFactors {params[0],throwExp} -e -x 2# -e 表示抛出异常时才触发#6、按照耗时进行过滤watch demo.MathGame primeFactors {params, returnObj} #cost200 -x 2# #cost200(单位是ms)表示只有当耗时大于200ms时才会输出过滤掉执行时间小于200ms的调用# watch/stack/trace这个三个命令都支持#cost# 表示当执行时间超过100ms的时候才会输出trace的结果:trace *StringUtils isBlank #cost100#7、观察当前对象中的属性watch demo.MathGame primeFactors target.illegalArgumentCount#8、获取类的静态字段、调用类的静态函数watch demo.MathGame * {params,demo.MathGamerandom.nextInt(100)} -v -n 1 -x 2# -v 参数打印更多信息watch/trace/monitor/stack/tt 命令都支持 -v 参数# 使用-v选项会打印Condition express的具体值和执行结果方便确认。watch -v -x 2 demo.MathGame print params params[0] 100000#9、比较枚举值watch demo.MathGame run params[0]demo.Outer$InnerONE -x 2#10、排除掉指定的类watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter# --exclude-class-pattern 参数可以排除掉指定的类watch/trace/monitor/stack/tt 命令都支持#11、访问静态变量# 在watch命令中访问会受到classloader的限制不推荐使用:watch com.taobao.container.Test test com.taobao.container.Testm# 用新版getstatic命令通过-c指定classloader可查看任意static变量同时支持ognl表达式处理getstatic com.alibaba.arthas.Test n entrySet().iterator.{? #this.key.name()STOP}#12、调用静态方法watch com.taobao.container.Test test java.lang.ThreadcurrentThread().getContextClassLoader()#13、按条件过滤watch com.taobao.container.Test test {params} params[0].{? #this.name tkg}.size()0 -x 2#14、匹配线程正则多个类多个方法trace -E nio\.Thread|test\.Executor select|runAllTasks ThreadcurrentThread().getName().contains(tkg-thre)#cost500#15、调用构造函数watch demo.Test test (#testnew java.util.ArrayList(), #test.add(abc), #test) -n 1watch demo.MathGame init {params,returnObj,throwExp} -v#16、访问Map中的元素watch demo.Test test demo.Testmap.keys -n 1# ongl针对Map接口提供了keys, values这两个虚拟属性可以像普通属性一样访问watch demo.Test test demo.Testmap.get(demo.TypeEnumvalueOf(RUN)) -n 1watch Test test Testn.entrySet().iterator.{? #this.key.name() RUN} -n 1其他技巧 后台运行可 ctrl z 挂起
jobs 查看后台(arthas)执行的任务
fg job-id 后台任务转前台
bg job-id 前台任务转后台
kill 停止异步执行的命令关于OGNL
可以存取对象的任意属性调用对象的方法遍历整个对象的结构图实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。Ognl类This class provides static methods for parsing and interpreting OGNL expressions.根据官方解释这个类是提供一些静态方法去解析表达式。
OgnlContextThis class defines the execution context for an OGNL expression.该类定义OGNL表达式的执行上下文。
public class OgnlContext extends Object implements Map {}OgnlContext类实现了Map接口所以它也是一个Map可以通过put方法往该上下文环境中放元素。该上下文环境中有两种对象根对象和普通对象。我们可以使用它的setRoot方法设置根对象。根对象只能有一个而普通对象则可以有多个。因为它实现了java.utils.Map 的接口。OgnlContextognl上下文根对象(1个)非根对象(n个)非根对象要通过#key访问根对象可以省略#key格式只能为#root。
获取根对象的属性值可以直接使用属性名作为表达式也可以使用#对象名.属性名的方式获取普通对象的属性值则必须使用#对象名.属性名的方式获取。可以将普通对象设置为根对象但只能有一个根对象后面设置的根对象会覆盖前面的根对象
OGNL的常见使用
1) 支持对象方法调用属性取值赋值如xxx.doSomeSpecial()age18(操作根)
2) 支持类静态的方法|值调用格式为 [类全名(包括包路径)][方法名|值名] ,如java.lang.Stringformat(foo%s,bar)--调用类静态方法java.lang.Thread$StateRUNNABLE --访问内部类枚举值java.lang.Threadclass --访问class对象#obj.getClass()tutorial.MyConstantAPP_NAME--访问类的静态值
3) 支持赋值操作和表达式串联如price100,discount0.8,calculatePrice()
4) 访问OGNL上下文 (OGNL context)和ActionContext
5) 对于OGNL来说数组与集合操作一样获取数组、集合对象如#users[1]
6) 操作map对象如#users[tkg]
7) 可以使用 || !
8) null可以直接使用如 #obj.do(null, new site.tkg.Boy(18))
9) 链式调用 #obj.do(null, (#boynew site.tkg.Boy(18),#boy.setAge(18),#boy))
10) 访问外部类对象 target.this$0OGNL的一些特殊用法与说明
过滤
? --获取集合中所有满足选择逻辑的对象
^ --获取集合中第一个满足选择逻辑的对象
$ --获取集合中最后一个满足选择逻辑的对象使用注意
1.创建集合不用加#创建map要加#
2.创建类的一个对象要使用类的完整路径
3.要创建带有初始化值的指定类型的List或Map可以这样#java.util.TreeMap{‘key’:’value’,’key’:’value’,……}
OGNL内置的虚拟属性
CollectionListMapSetIteratorEnumerationsize isEmptysize iteratorsize keys valuessize iteratornext hasNextnext hasNext nextElement hasMoreElements
OGNL的个人思考
request, #request.username都可以访问原因推测根对象有相应属性上下文对象同时做了保存书写转换问题
watch site.tkgup.Demo traceE {params,returnObj,throwExp} -n 5 -x 3 params[0]nameparams.{#this[0]name}
watch site.tkgup.Demo test {params,returnObj,throwExp} -n 5 -x 3 throwExp ! nullthrowExp.{#this ! null}OGNL的杂碎收集未做验证
OGNL中的#、%和$符号
#用法a. 访问非根对象属性如#session.userNameb. 用于引用当前对象进行方法调用等集合搭配、^、$进行过滤、映射过滤persons.{?#this.age20}映射persons.{name}过滤是取行的操作而投影是取列的操作在使用过滤操作时使用#this用于代表当前正在迭代的集合中的对象,当前元素c. 构造Map如#{foo1:bar1, foo2:bar2}$用法a. 在国际化资源文件中引用OGNL表达式reg.agerange国际化资源信息年龄必须在${min}同${max}之间b. 在Struts 2框架的配置文件中引用OGNL表达式validatorsfield nameintbfield-validator typeintparam namemin10/paramparam namemax100/parammessage数字必须为${min}为${max}之间/message/field-validator/field/validators%用法不像是OGNL的操作符%符号的用途是在标志的属性为字符串类型时计算OGNL表达式的值如h3构造Map/h3s:set namefoobar value#{foo1:bar1, foo2:bar2}/pThe value of key foo1 is s:property value#foobar[foo1]//pp不用s:url value#foobar[foo1]//pp使用s:url value%{#foobar[foo1]}//p结果he value of key foo1 is bar1不使用%#foobar[foo1]使用%bar1Struts2标签库 属性值中的%与#号的关系
1如果标签的属性值是OGNL表达式那么无需加上%{}。
2如果标签的属性值是字符串类型那么在字符串当中凡是出现的%{}都会被解析成OGNL表达式解析完毕后再与其他的字符串进行拼接构造出最后的字符串值。
3我们可以在所有的属性值上加%{}这样如果该属性值是OGNL表达式那么标签处理类就会将%{}忽略掉