Arthas诊断工具获取类属性、实例属性值

测试基类

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是一个好的习惯,否则执行的时候可能会报类解析/找不到的异常。

方法1:使用sc + getstatic

[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]

三、获取类实例

vmtool

[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表达式

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值