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实例操作是本文所介绍的内 ...
随机推荐
- 【C# 基础概念】Unicode编码详解
Unicode定义:Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字 ...
- oracle 12c RAC 重启
转至:https://blog.csdn.net/weixin_40283570/article/details/81511072 关闭顺序 :关闭PDB----->关闭数据库------> ...
- 文件上传漏洞之js验证
0x00 前言 只有前端验证=没有验证 0x01 剔除JS 打开burpsuite,进入Proxy的Options,把Remove all JavaScript选上. 设置浏览器代理直接上传PHP木马 ...
- Vue 源码解读(10)—— 编译器 之 生成渲染函数
前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...
- Windows下Apache服务多个端口反向代理配置
修改\Apache24\conf\httpd.conf: 1.修改安装包地址: Define SRVROOT "/Apache24" 修改为: Define SRVROOT &qu ...
- LeetCode-022-括号生成
括号生成 题目描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https ...
- 关于 vue2.x 的 $attrs 和 $listeners
$attrs $attrs 用于多层次组件传递参数(组件标签的attribute,class和style除外),爷爷辈组件向孙子辈组件传递参数(注:参数不能被父辈prop识别,一旦被父辈prop识别且 ...
- Jmeter-根据负载计算并发用户实际案例
业务场景 假设公司领导现在给你分配了一个性能测试需求如下: 1:公司有1000人在上班时间段会登录平台进行打卡操作,可能会登录打卡多次2:业务高峰时间段在8:00-8:30,半小时3:需要保证90%用 ...
- 矩池云 | Tony老师解读Kaggle Twitter情感分析案例
今天Tony老师给大家带来的案例是Kaggle上的Twitter的情感分析竞赛.在这个案例中,将使用预训练的模型BERT来完成对整个竞赛的数据分析. 导入需要的库 import numpy as np ...
- 构造方法__construct()与析构方法__destruct() 构造方法:刚出生时婴儿的啼哭 析构方法:老人临终时的遗言
<?phpclass person{ var $name; var $sex; var $age;//构造方法 function __construct($name, $sex, $age) { ...