如何使用arthas查看成员变量
搜了一下官方文档没找到合适方法直接查看对象的成员变量,发现一位朋友有这样一个办法,一般我们用Spring时,可以写一个Holder类,实现ApplicationContextWare接口,这样我们在Spring加载后可以获取其context变量,context.getBean可以通过类名获取对象。所以基于这个想法,可以这样写,完整示例如下:
1、定义Holder类import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
assertApplicationContext();
return applicationContext;
}
public static T getBean(String beanName) {
assertApplicationContext();
return (T) applicationContext.getBean(beanName);
}
public static T getBean(Class requiredType) {
assertApplicationContext();
return applicationContext.getBean(requiredType);
}
private static void assertApplicationContext() {
if (SpringContextHolder.applicationContext == null) {
throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!");
}
}
}
2、测试服务import com.alibaba.fastjson.JSON;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.stereotype.Component;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@Component
public class DocService {
private int id = 1;
private String name = "程序喵";
private Cache> cache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.MINUTES).build();
public String doSomething() {
// 加入缓存
cache.put("tingfeng", Optional.ofNullable("单身,求撩"));
return id + " : " + name;
}
}
3、测试入口@RestController
@RequestMapping("/index")
public class IndexController {
@Autowired
private DocService service;
@GetMapping("/test")
public Object test() {
return service.doSomething();
}
}
4、开始 arthas 测试
我想要观察到 DocService 下的 id,name,cache 成员变量的值。
[arthas@89254]$ ognl '@com.esper.utils.SpringContextHolder@getBean("docService").id'
@Integer[1]
[arthas@89254]$ ognl '@com.esper.utils.SpringContextHolder@getBean("docService").name'
@String[程序喵]
[arthas@89254]$ ognl '@com.esper.utils.SpringContextHolder@getBean("docService").cache'
@LocalManualCache[
localCache=@LocalCache[isEmpty=true;size=0],
serialVersionUID=@Long[1],
]
开始执行 cache 时没有值,调用一下接口给 cache 赋值,http://localhost:8080/index/test[arthas@89254]$ ognl '@com.esper.utils.SpringContextHolder@getBean("docService").cache'
@LocalManualCache[
localCache=@LocalCache[isEmpty=false;size=1],
serialVersionUID=@Long[1],
]
[arthas@89254]$ ognl '@com.esper.utils.SpringContextHolder@getBean("docService").cache.asMap()'
@LocalCache[
@String[tingfeng]:@Optional[Optional[单身,求撩]],
]
[arthas@89254]$
另外 arthas 提供了查看静态变量的方式查看运行的代码:jad com.xx.ClassName
查看类的静态成员:getstatic cn.xx.ClassName propName
查看方法:jad cn.xx.ClassName toString