学习arthas(九)动态执行一些代码

Arthas
placeholder image
admin 发布于:2023-09-30 18:10:59
阅读:loading

所谓的执行一些代码主要是手工调用已有的一些被加载类的方法,并不是像JavaScript中的eval函数那么自由(本站深度研究过Apache Commons JCI项目可以动态的编译一些Java源代码为class,并加载它们来执行),本次主要使用arthas来执行一些已有的代码,这些代码并不一定是完整可调用的存在于某个方法,可能是需要多行自定义的方法,或者是单独新编写的,用于做一些补偿性的事情,比如某些原因导致的定时任务没有正常的执行,需要手工触发;再比如调用一些方法获取一些连接池的参数等等。

前面有使用`getstatic`和`ognl`分别做过一些实践,本次针对它们再次实践,属实是值得拥有。

1.getstatic实践

(1)通过 getstatic 命令可以方便的查看类的静态属性。使用方法为`getstatic class_name field_name`,推荐直接使用ognl命令,更加灵活。

(2)如果该静态属性是一个复杂对象,还可以支持在该属性上通过 ognl 表示进行遍历,过滤,访问对象的内部属性等操作。

(3)获取的静态属性不限制访问修饰符,对于private私有的也可以正常访问。

(4)花了几分钟测试了一下,让GetStatic继承了一下Thread类,但是无法拿到父类中的静态字段,提示字段不存在。

/**
 * 演示获取静态字段
 *
 * @author chendd
 * @date 2023/9/25 13:16
 */
public class GetStatic {

    private static String USER_NAME = "chendongdong";

    private static final String WEBSITE = "https://www.chendd.cn";

    private static Point point = new Point(9 , 11);

    public static void main(String[] args) throws IOException {

        System.in.read();
    }
    
}

image.png

2.ognl基本用法

image.png

(1)调用无参非静态方法;

(2)调用带参数的非静态方法;

(3)定义多个变量表达式,输出多个变量;

(4)实例化一个类,并调用类的方法,再对方法返回值二次处理;

(5)调用一个静态方法;

(6)一次编写多个表达式,包含对象参数的传递;

3.ognl更多用法

(1)查看Spring Bean Application类的字节码

image.png

(2)查看Spring Bean 容器中连接池中的connectCount 和 closeCount属性的值

image.png

(3)调用Spring Bean 容器中组件的方法

image.png

(4)调用一个Controller方法,传递对象类型的参数,包含枚举类型、实例化对象、属性赋值等

image.png


 点赞


 发表评论

当前回复:作者

 评论列表


留言区