Arthas之实例操作
Arthas之实例操作
1. 静态类属性操作
获取public静态属性
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@pubTestPrex'
ognl -c 7cd84586 "@com.system.framework.ArtahsDemoClassLoader@pubfinalTestPrex"
输出各式 @Type[属性值],内容如下
@String[static public]
...
@String[final static public]
获取private静态属性
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@privTestPrex'
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@privFnalTestPrex'
@String[static private]
...
@String[final static private]
修改public静态属性,被final修饰,不能被修改
// author:herbert qq:464884492 date:20220331 测试代码想修改FINAL修饰符,结果没有成功
@Test
public void testModifyFinal() throws Exception {
Field finalField = this.getClass().getDeclaredField("privFnalTestPrex");
finalField.setAccessible(true);
System.out.println("==========初始值==========");
System.out.println(finalField.get(null));
Field modiField = Field.class.getDeclaredField("modifiers");
modiField.setAccessible(true);
modiField.setInt(finalField, finalField.getModifiers() & ~Modifier.FINAL);
finalField.set(null, "修改后FInal");
System.out.println("==========修改值==========");
System.out.println(privFnalTestPrex);
}
静态变量赋值,不能通过=直接赋值,需要采用反射的方式设置值
ognl '#c=@com.system.framework.ArtahsDemoClassLoader@class,#f=#c.getDeclaredField("pubTestPrex"),#f.set(#c,"modify static public ")'
修改private静态属性,需要在反射时调用方法setAccessible
,使private特殊转化为public
ognl '#c=@com.system.framework.ArtahsDemoClassLoader@class,#f=#c.getDeclaredField("privTestPrex"),#f.setAccessible(true),#f.set(#c,"modify static private ")'
2. 静态类方法调用
静态方法调用和静态属性一样,格式为@class@method(args)
无参数调用
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@setPublicStaticMethod()'
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@modfiyPrivateStaticFiled()'
...
======第5次输出======
源文件初始输出==>static public/static private/testRefect--1/final static public/final static private
源文件初始输出==>static public/static private/testRefect--2/final static public/final static private
======第6次输出======
源文件初始输出==>modify by method static public/static private/testRefect--1/final static public/final static private
源文件初始输出==>modify by method static public/static private/testRefect--2/final static public/final static private
...
======第11次输出======
源文件初始输出==>modify by method static public/static private/testRefect--1/final static public/final static private
源文件初始输出==>modify by method static public/static private/testRefect--2/final static public/final static private
======第12次输出======
源文件初始输出==>modify by method static public/modify by method static private/testRefect--1/final static public/final static private
源文件初始输出==>modify by method static public/modify by method static private/testRefect--2/final static public/final static private
...
// author:herbert qq:464884492 date:20220331
有参数调用
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@getPublicStaticMethod("input params")'
...
ognl -c 7cd84586 '@com.system.framework.ArtahsDemoClassLoader@getStaticPrivateMethod("input params")'
@String[input params <==> public static method return string]
...
@String[input params <==> private static method return string]
从以上的测试结果来说,静态方法不管是public还是private都可以直接调用。
3. 获取非静态类实例
查看某个类实例,无 --limit 参数默认10个
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express 'instances.length'
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express 'instances[0]'
@EncryptClass[][
@EncryptClass[com.system.framework.EncryptClass@3c573d32],
@EncryptClass[com.system.framework.EncryptClass@68390fae],
]
...
@Integer[2]
...
@EncryptClass[
note=@String[testRefect--1],
]
经过上边测试发现,一个类存在多个classloader加载时,需要指定classloader。但从返回结果看,返回了所有classloader加载的实例
4. 实例方法调用
调用实例 getNote
和 setNote
方法
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances[0],#val.getNote()'
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances[0],#val.setNote("modify by instance"+#val.getNote())'
@String[testRefect--1]
======第7次输出======
源文件初始输出==>static public/static private/testRefect--1/final static public/final static private
源文件初始输出==>static public/static private/testRefect--2/final static public/final static private
======第8次输出======
源文件初始输出==>static public/static private/modify by instancetestRefect--1/final static public/final static private
源文件初始输出==>static public/static private/testRefect--2/final static public/final static private
从控制台输出结果,对比第7次和8次输出,我们可以发现第一个loader加载的class实例已经成功修改了
5. 实例属性操作
获取或者修改第一个实例 note 属性
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances[1].note'
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances[1],#val.note="modify by instance"+#val.note'
@String[testRefect--2]
...
======第121次输出======
源文件初始输出==>static public/static private/modify by instancetestRefect--1/final static public/final static private
源文件初始输出==>static public/static private/testRefect--2/final static public/final static private
======第122次输出======
源文件初始输出==>static public/static private/modify by instancetestRefect--1/final static public/final static private
源文件初始输出==>static public/static private/modify by instancetestRefect--2/final static public/final static private
从控制台输出结果,对比第121次和122次输出,我们可以发现第二个loader加载的class实例已经成功修改了
6. 条件操作
返回的对象集合,可以做二次筛选投影操作,也可以带条件查询符合的数据
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances'
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances.{note}'
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances.{#this.note}'
vmtool -c 3e2e18f2 -a getInstances --className *EncryptClass --express '#val=instances.{? #this.note.indexOf("1")>0}.{note}'
@EncryptClass[][
@EncryptClass[com.system.framework.EncryptClass@52790e67],
@EncryptClass[com.system.framework.EncryptClass@822cf83],
]
...
@ArrayList[
@String[modify by instancetestRefect--1],
@String[modify by instancetestRefect--2],
]
...
@ArrayList[
@String[modify by instancetestRefect--1],
@String[modify by instancetestRefect--2],
]
...
@ArrayList[
@String[modify by instancetestRefect--1],
]
7. 总结
欢迎感兴趣的朋友关注我的订阅号“小院不小”,或点击下方二维码关注。我将多年开发中遇到的难点,以及一些有意思的功能,体会都会一一发布到我的订阅号中
Arthas之实例操作的更多相关文章
- [转]使用Xcode 4发布App 实例操作
使用xcode 4发布app 实例操作是本文介绍的内容,不多说,我们直接进入话题. 1.iOS Provisioning Portal 和iTunes Connect 没有变,下载与安装.mobile ...
- Flashback Drop实例操作
1.Flashback DropFlashback Drop 是从Oracle 10g 开始出现的,用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle B ...
- 058——VUE中vue-router之实例操作新闻列表单页面应用与路由别名的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 040——VUE中组件之组件间的数据参props的使用实例操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 034——VUE中表单控件处理之使用vue控制radio表单的实例操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php5.4以上 mysqli 实例操作mysql 增,删,改,查
<?php //php5.4以上 mysqli 实例操作mysql header("Content-type:text/html;charset=utf8"); $conn ...
- [Sqlite]-->嵌入式数据库事务理解以及实例操作
引子: 1. Sqlite在Windows.Linux 和 Mac OS X 上的安装过程 2,嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录 SQLite 事务(Tran ...
- 每天一个JavaScript实例-操作元素定位元素
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Qt数据库 QSqlTableModel实例操作(转)
本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容.与上篇内容衔接着,不顾本文也有关于上篇内容的链接. Qt数据库 QSqlTableModel实例操作是本文所介绍的内 ...
随机推荐
- weblogic自动化打补丁脚本
转至:https://www.it610.com/article/1294086996750311424.htm 目的 weblogic每个季度都会有psu更新,打补丁操作也变成了每个季度都要做的事情 ...
- Qt:QListWidgetItem
0.说明 一个QListWidgetItem是QListWidget中的一项(一行). 每个Item都可以持有多部分的信息,并将它们在适当时候展示出来. 在构造一个Item时指明它所在的List Wi ...
- 两天两夜,1M图片优化到100kb!
坦白从宽吧,我就是那个花了两天两夜把 1M 图片优化到 100kb 的家伙--王小二! 自从因为一篇报道登上热搜后,我差点抑郁,每天要靠 50 片安眠药才能入睡. 网络上曝光的那些关于一码通的消息,有 ...
- [2022-3-5] OICLASS-USACO提高组模拟赛2 B: Cow Frisbee
题意 在一排奶牛中,对于每两头奶牛,如果两头奶牛之间没有奶牛比这两头高,则答案累加这两头奶牛的距离. 分析 设现在分析的奶牛为第 \(i\) 头,它向左扔出了一个飞盘,显然它的飞行高度为奶牛的高度.飞 ...
- LGP4287题解
小清新 manacher 题.题意清楚. 首先看到回文,自然而然地就去想 manacher 了.先想想,manacher 到底在干嘛? manacher 做的其实是一个暴力,枚举每一个位置最远能够伸到 ...
- CF917D题解
题目大意 一张有 \(n\) 个节点的完全图,再给出这张图的一棵生成树,问该图有多少颗生成树和这颗生成树的公共边总共有 \(k\) 条,求助 \(0 \leq k \leq n-1\) 时所有 \(k ...
- Linux特殊权限之suid、sgid、sbit权限
文件权限管理之特殊命令 一:特殊权限 昨天所学的Linux基本权限为为9个:分别是rwx rwx rwx.但有时会发现系统中会有一些特殊的权限位符号: 例如: Linux系统一共有12个特殊权限符: ...
- 道路中心线提取、河道中心线的提取(ArcScan)
道路中心线的提取,相信大家并不陌生. 道路中心线是道路路线几何设计中的重要特征线,也是道路交通管理中的重要控制线. 街区内的道路应考虑消防车道的通行,道路中心线间的距离不宜大于160米. 今儿个,博主 ...
- 机器学习之主成分分析(PCA)
import numpy as np #(1)零均值化def zeroMean(dataMat): meanVal=np.mean(dataMat,axis=0) newData =dataMat - ...
- 火狐firebug&firepath插件安装
火狐浏览器下掉了firebug和firepath插件,用户即使下载了火狐55以下的版本,也无法查找到这两个插件,以下方法可以解决哦 第1步:下载火狐55以内版本安装包,安装时迅速设置禁止自动更新版本, ...