问题
当更新了类之后,怎么样在生产环境判断类或对象中的字段,方法有没有被正常更新呢?这个时候可以使用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篇章看详细解答