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. 实例方法调用

调用实例 getNotesetNote 方法

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之实例操作的更多相关文章

  1. [转]使用Xcode 4发布App 实例操作

    使用xcode 4发布app 实例操作是本文介绍的内容,不多说,我们直接进入话题. 1.iOS Provisioning Portal 和iTunes Connect 没有变,下载与安装.mobile ...

  2. Flashback Drop实例操作

    1.Flashback DropFlashback Drop 是从Oracle 10g 开始出现的,用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle B ...

  3. 058——VUE中vue-router之实例操作新闻列表单页面应用与路由别名的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 040——VUE中组件之组件间的数据参props的使用实例操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 034——VUE中表单控件处理之使用vue控制radio表单的实例操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. php5.4以上 mysqli 实例操作mysql 增,删,改,查

    <?php //php5.4以上 mysqli 实例操作mysql header("Content-type:text/html;charset=utf8"); $conn ...

  7. [Sqlite]--&gt;嵌入式数据库事务理解以及实例操作

    引子: 1. Sqlite在Windows.Linux 和 Mac OS X 上的安装过程 2,嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录 SQLite 事务(Tran ...

  8. 每天一个JavaScript实例-操作元素定位元素

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. Qt数据库 QSqlTableModel实例操作(转)

    本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容.与上篇内容衔接着,不顾本文也有关于上篇内容的链接. Qt数据库 QSqlTableModel实例操作是本文所介绍的内 ...

随机推荐

  1. 在Mac上安装mysql并配置环境(详细篇)

    在Mac上安装mysql并配置环境(详细篇) 1.下载mysql mysql官网 这一步根据自己电脑架构选择,分为arm和x86 下载完成之后打开就可以 接下来运行安装就可以,一直下一步,设置完密码就 ...

  2. WIN10:IE浏览器的默认主页以及通过链接搜索的默认引擎

    主页设置: 地址栏搜索引擎:

  3. omnet++:使用教程

    学习自:(6条消息) omnet++ 快速入门 | 计算机网络仿真 | omnet++ 入门教程_叶局长的博客-CSDN博客 1.使用omnet仿真的一般步骤 主要有3步: 使用ned(network ...

  4. 数据分析logistic回归与时间序列

    logistics回归 1.影响关系研究是所有研究中最为常见的. 2.当y是定量数据时,线性回归可以用来分析影响关系. 3.如果现在想对某件事情发生的概率进行预估,比如一件衣服的是否有人想购买? 这里 ...

  5. MySql的事务及数据的导入导出

    Mysql的事务及应用 1.补充数据库的导入与导出 导入 mysql -u root -p database < E:/SS/Test.sql -- 即执行sql文件 导出 -- 结构+数据 m ...

  6. dependencies与devDependencies中应该放哪些依赖

    网上一般的解释都是,开发环境用devDependencies,生产环境用dependencies,说的很简明,但是这里有个问题是,哪些包需要放到devDependencies中,哪些包需要放到depe ...

  7. Thread线程基本写法用法

    //线程属性 protected Thread workerThread; protected bool isWorkerThreadStopped = true; public void Initi ...

  8. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(7)- 从SD/eMMC启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRTxxx系列MCU的SD/eMMC卡启动. 关于 i.MXRT 启动设备,痞子衡之前写过很多篇文章,都是关于串并行 NO ...

  9. SQL从零到迅速精通【实用函数(3)】

    1.LOWER()函数 使用LOWER函数将字符串中所有字幕字符转换为小写,输入语句如下. SELECT LOWER('BEAUTIFUL'),LOWER('Well'); 2.UPPER()函数 S ...

  10. 手写 Vue 系列 之 Vue1.x

    前言 前面我们用 12 篇文章详细讲解了 Vue2 的框架源码.接下来我们就开始手写 Vue 系列,写一个自己的 Vue 框架,用最简单的代码实现 Vue 的核心功能,进一步理解 Vue 核心原理. ...