Arthas - 查找類


問題

當更新了類之后,怎么樣在生產環境判斷類或對象中的字段,方法有沒有被正常更新呢?這個時候可以使用Arthas的sc命令來查找JVM中已經加載的類

操作

  • sc -d com.ct.hear.entity.*
    通過這個命令可知,實體類加載了兩個對象,Article和MessageLog
[arthas@4967]$ sc -d com.ct.hear.entity.* class-info com.ct.hear.entity.Article code-source file:/data/1data/1data-project-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/ name com.ct.hear.entity.Article isInterface false isAnnotation false isEnum false isAnonymousClass false isArray false isLocalClass false isMemberClass false isPrimitive false isSynthetic false simple-name Article modifier public annotation io.swagger.annotations.ApiModel interfaces java.io.Serializable super-class +-java.lang.Object class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@21b8d17c +-sun.misc.Launcher$AppClassLoader@70dea4e +-sun.misc.Launcher$ExtClassLoader@2038ae61 classLoaderHash 21b8d17c class-info com.ct.hear.entity.MessageLog code-source file:/data/1data/1data-project-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/ name com.ct.hear.entity.MessageLog isInterface false isAnnotation false isEnum false isAnonymousClass false isArray false isLocalClass false isMemberClass false isPrimitive false isSynthetic false simple-name MessageLog modifier public annotation io.swagger.annotations.ApiModel interfaces java.io.Serializable super-class +-java.lang.Object class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@21b8d17c +-sun.misc.Launcher$AppClassLoader@70dea4e +-sun.misc.Launcher$ExtClassLoader@2038ae61 classLoaderHash 21b8d17c Affect(row-cnt:2) cost in 17 ms. 
  • sc -d *UserController | grep class
    sc命令還支持管道,使用這個命令來獲取UserController的信息
[arthas@81]$ sc -d *UserController | grep class class-info com.example.demo.arthas.user.UserController code-source file:/root/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ super-class +-java.lang.Object class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@728938a9 classLoaderHash 728938a9 
  • sc -d -f com.ct.hear.entity.*
    再使用這個命令獲取到該Object下的Field
[arthas@4967]$ sc -d -f com.ct.hear.entity.Article class-info com.ct.hear.entity.Article code-source file:/data/1data/1data-project-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/ name com.ct.hear.entity.Article isInterface false isAnnotation false isEnum false isAnonymousClass false isArray false isLocalClass false isMemberClass false isPrimitive false isSynthetic false simple-name Article modifier public annotation io.swagger.annotations.ApiModel interfaces java.io.Serializable super-class +-java.lang.Object class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@21b8d17c +-sun.misc.Launcher$AppClassLoader@70dea4e +-sun.misc.Launcher$ExtClassLoader@2038ae61 classLoaderHash 21b8d17c fields name serialVersionUID type long modifier final,private,static value 1 name id type java.lang.String modifier private annotation com.baomidou.mybatisplus.annotation.TableId,io.swagger.annotations.ApiModelProperty name title type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name summary type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name pcontent type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name emotion type java.lang.Integer modifier private annotation io.swagger.annotations.ApiModelProperty name pubTime type java.lang.Long modifier private annotation io.swagger.annotations.ApiModelProperty name createTime type java.lang.Long modifier private annotation io.swagger.annotations.ApiModelProperty name url type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name author type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name authorAddress type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name authorGender type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name mediaName type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name mediaType type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name mediaArea type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name coreWords type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name monitorWords type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name fromSource type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name readNum type java.lang.Integer modifier private annotation io.swagger.annotations.ApiModelProperty name commentNum type java.lang.Integer modifier private annotation io.swagger.annotations.ApiModelProperty name praiseNum type java.lang.Integer modifier private annotation io.swagger.annotations.ApiModelProperty name forwardNum type java.lang.Integer modifier private annotation io.swagger.annotations.ApiModelProperty name column type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty,com.baomidou.mybatisplus.annotation.TableField name topic type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name fansNum type java.lang.Integer modifier private annotation io.swagger.annotations.ApiModelProperty name verifyType type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty name parentId type java.lang.String modifier private annotation io.swagger.annotations.ApiModelProperty Affect(row-cnt:1) cost in 18 ms. 

思考

如果一個類被多個類加載器(classLoader)加載,調用第一條命令會出現多個對象,這是因為對於JVM來說,不同的類加載器加載出的對象是肯定不同的;兩個對象equals的前提,就是它們由相同的類加載器加載,可以移步到JVM篇章看詳細解答


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM