使用arthas ognl表达式调试方法

idea在线安装arthas插件

 安装完之后重启,进入设置,添加spring static content ognl setting配置,这个配置主要是获取spring应用的上下文对象,在spring工程中添加一下代码就可以了:

package com.mysteel.oem.database.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order
public class ApplicationContextHolder implements ApplicationContextAware {
    /**
     * Spring应用上下文环境
     */
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHolder.context = applicationContext;
    }
}

右键你想监控的方法

 

点击复制命令,放在arthas客户端去执行,用idea的目的就是生成执行命令较为方便

下面我们根据一个spring bean来测试

package com.mysteel.oem.database.service.impl;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class TestImpl {
    private int param1 = 0;
    private static int param2 = 1;

    public List<Response>  test(Param param){
        return  test1(param);
    }

    public List<Response>  test1(Param param){
        return  test2(param);
    }

    public List<Response>  test2(Param param){
        List<Response> userList = new ArrayList<>();
        if(param.getName().startsWith("y")){
            Response  response = new Response();
            HashMap map = new HashMap();
            response.setName("yy");
            response.setAge(0);
            response.setInner(param.inner);
            map.put(response.name,response.age);
            response.setMap(map);
            userList.add(response);
        }else if(param.getName().startsWith("z")){
            Response  response = new Response();
            HashMap map = new HashMap();
            response.setName("zz");
            response.setAge(1);
            response.setInner(param.inner);
            map.put(response.name,response.age);
            response.setMap(map);
            userList.add(response);
        }else {
            Response  response1 = new Response();
            HashMap map1 = new HashMap();
            response1.setName("aa");
            response1.setAge(2);
            response1.setInner(param.inner);
            map1.put(response1.name,response1.age);
            response1.setMap(map1);
            userList.add(response1);

            Response  response2 = new Response();
            HashMap map2 = new HashMap();
            response2.setName("bb");
            response2.setAge(3);
            response2.setInner(param.inner);
            map2.put(response1.name,response1.age);
            response1.setMap(map2);
            userList.add(response2);
        }
        return  userList;
    }

    @Data
    public static class Inner{
        private String school;

        public Inner(String school) {
            this.school = school;
        }
    }
    @Data
    public static class Response{
        private String name;
        private Integer age;
        private Inner inner;
        private Map<String,Integer> map;
    }

    @Data
    public static class Param{
        private String name;
        private Integer age;
        private Inner inner;

        public Param(String name, Integer age, Inner inner) {
            this.name = name;
            this.age = age;
            this.inner = inner;
        }
    }
}

获取spring bean对象中的普通属性

[arthas@17476]$ ognl -x 3 '#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").param1'
@Integer[0]

获取静态属性

[arthas@17476]$ ognl -x 3 '@com.mysteel.oem.database.service.impl.TestImpl@param2'
@Integer[1]

执行方法-对象传参,返回list

[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))'
@ArrayList[
    @Response[
        name=@String[aa],
        age=@Integer[2],
        inner=@Inner[
            school=@String[abc],
        ],
        map=@HashMap[
            @String[aa]:@Integer[2],
        ],
    ],
    @Response[
        name=@String[bb],
        age=@Integer[3],
        inner=@Inner[
            school=@String[abc],
        ],
        map=null,
    ],
]

对返回的结果取值-根据索引取list中的元素

[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))[0]'
@Response[
    name=@String[aa],
    age=@Integer[2],
    inner=@Inner[
        school=@String[abc],
    ],
    map=@HashMap[
        @String[aa]:@Integer[2],
    ],
]

对返回的结果取值-取对象中的属性

[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))[0].name'
@String[aa]

 对返回的结果取值-map中根据key取value

[arthas@22068]$ ognl -x 3 '#inner=new com.mysteel.oem.database.service.impl.TestImpl$Inner("abc"),#springContext=@com.mysteel.oem.database.util.ApplicationContextHolder@context,#springContext.getBean("testImpl").test2(new com.mysteel.oem.database.service.impl.TestI
mpl$Param("asdsa",1,#inner))[0].map["aa"]'
@Integer[2]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值