测试基类
package com.alipay.arthasapitest
public class ArthasTestClass {
private String privateInstanceProperty = "privateInstancePropertyValue";
public String publicInstanceProperty = "publicInstancePropertyValue";
private static String privateStaticProperty = "privateStaticPropertyValue";
public static String publicStaticProperty = "publicStaticPropertyValue";
public static final Map<String, String> map = new HashMap<>() {{
put("key1", "value1");
put("key2", "value2");
}};
public String getPrivateInstanceProperty() {
return privateInstanceProperty;
}
public void setPrivateInstanceProperty(String privateInstanceProperty) {
this.privateInstanceProperty = privateInstanceProperty;
}
public String getPublicInstanceProperty() {
return publicInstanceProperty;
}
public void setPublicInstanceProperty(String publicInstanceProperty) {
this.publicInstanceProperty = publicInstanceProperty;
}
public static void setPublicStaticProperty(String publicStaticProperty) {
ArthasTestClass.publicStaticProperty = publicStaticProperty;
}
public static String getPublicStaticProperty() {
return publicStaticProperty;
}
}
一、获取静态变量值
如果类被多个claasloader所加载,使用sc指定claasloader是一个好的习惯,否则执行的时候可能会报类解析/找不到的异常。
[arthas@39075]$ sc -d com.alipay.arthasapitest.ArthasTestClass
class-info com.alipay.arthasapitest.ArthasTestClass
code-source /Users/wangte/IdeaProjects/arthas-api-test/target/classes/
name com.alipay.arthasapitest.ArthasTestClass
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name ArthasTestClass
modifier public
annotation org.springframework.stereotype.Service
interfaces
super-class +-java.lang.Object
class-loader +-jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7
+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@5a3cf824
classLoaderHash 251a69d7
[arthas@39075]$ getstatic -c 251a69d7 com.alipay.arthasapitest.ArthasTestClass publicStaticProperty
field: publicStaticProperty
@String[publicStaticPropertyValue]
Affect(row-cnt:1) cost in 14 ms.
[arthas@39075]$ getstatic com.alipay.arthasapitest.ArthasTestClass privateInstanceProperty
field: privateInstancePropertyValue
@String[publicStaticPropertyValue]
Affect(row-cnt:1) cost in 26 ms.
方法2:使用sc + ognl,注:在某些公司,因为安全原因会禁用ognl表达式的功能,这种情况下可以选择其他的方式
[arthas@39075]$ sc -d com.alipay.arthasapitest.ArthasTestClass
class-info com.alipay.arthasapitest.ArthasTestClass
code-source /Users/wangte/IdeaProjects/arthas-api-test/target/classes/
name com.alipay.arthasapitest.ArthasTestClass
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name ArthasTestClass
modifier public
annotation org.springframework.stereotype.Service
interfaces
super-class +-java.lang.Object
class-loader +-jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7
+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@5a3cf824
classLoaderHash 251a69d7
Affect(row-cnt:1) cost in 39 ms.
[arthas@39075]$
[arthas@39075]$ ognl -c 251a69d7 @com.alipay.arthasapitest.ArthasTestClass@publicStaticProperty
@String[publicStaticPropertyValue]
[arthas@39075]$ognl @com.alipay.arthasapitest.ArthasTestClass@publicStaticProperty
@String[publicStaticPropertyValue]
方法3 : watch
[arthas@42336]$ watch com.alipay.arthasapitest.ArthasTestClass getPrivateInstanceProperty -x 2 -n 1
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 70 ms, listenerId: 1
method=com.alipay.arthasapitest.ArthasTestClass.getPrivateInstanceProperty location=AtExit
ts=2024-04-24 23:11:51; [cost=1.416625ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
@ArthasTestClass[
privateInstanceProperty=@String[privateInstancePropertyValue],
publicInstanceProperty=@String[publicInstancePropertyValue],
privateStaticProperty=@String[privateStaticPropertyValue],
publicStaticProperty=@String[publicStaticPropertyValue],
map=@[isEmpty=false;size=2],
],
@String[privateInstancePropertyValue],
]
二、静态方法调用
[arthas@39075]$ognl @com.alipay.arthasapitest.ArthasTestClass@publicStaticProperty@getPublicStaticProperty -c 251a69d7
@String[publicStaticPropertyValue]
三、获取类实例
[arthas@42336]$ vmtool --action getInstances --className com.alipay.arthasapitest.ArthasTestClass --express 'instances[0]'
@ArthasTestClass[
privateInstanceProperty=@String[privateInstancePropertyValue],
publicInstanceProperty=@String[publicInstancePropertyValue],
privateStaticProperty=@String[privateStaticPropertyValue],
publicStaticProperty=@String[publicStaticPropertyValue],
map=@[isEmpty=false;size=2],
]
可以看到获取类实例的时候同样会将类对应的属性值打印出来。
四、获取类实例属性值
除了根据类实例获取属性值的方法外,我们还可以根据watch来观察类实例的属性值
[arthas@42336]$ watch com.alipay.arthasapitest.ArthasTestClass getPrivateInstanceProperty -x 2 -n 1
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 70 ms, listenerId: 1
method=com.alipay.arthasapitest.ArthasTestClass.getPrivateInstanceProperty location=AtExit
ts=2024-04-24 23:11:51; [cost=1.416625ms] result=@ArrayList[
@Object[][isEmpty=true;size=0],
@ArthasTestClass[
privateInstanceProperty=@String[privateInstancePropertyValue],
publicInstanceProperty=@String[publicInstancePropertyValue],
privateStaticProperty=@String[privateStaticPropertyValue],
publicStaticProperty=@String[publicStaticPropertyValue],
map=@[isEmpty=false;size=2],
],
@String[privateInstancePropertyValue],
]
五、类实例方法调用
[arthas@42336]$ vmtool --action getInstances --className com.alipay.arthasapitest.ArthasTestClass --express 'instances[0].getPublicInstanceProperty()'
@String[publicInstancePropertyValue]
更多使用可以参考:活用ognl表达式