# Class

## 获取

## 编写代码输出

待续...

## 运行中获取

如题：如何获取运行状态的Class文件？

常见的，Spring的Aop，在运行时会产生代理Class对象，做源码分析，必定会考虑反编译一下Class文件，至于反编译有很多方法（如何反编译Class?[飞机票](https://atsjp.gitbook.io/note/java/sourceanalysis/jdk/class)），本次不在叙述。

那么，如何获取运行状态的Class文件呢，Jdk官方提供了一个工具：sa-jdi.jar，官方称之为HSDB(HotSpot Debugger)。

一般这个文件在Jdk安装目录下的：\lib 可以找得到。

### sa-jdi

#### 如何运行

```cmd
java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
```

#### 如何使用

执行运行命令，有如下界面，选中File>Attach to HotSpot Process...

![HSDB](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-1433dd2ebeedba6a9e8e38f1aac972b504134685%2FHSDB.png?alt=media)

之后，在弹框中输入运行应用的Pid（Pid可以利用jps命令获取，通常是jps -l）：

![HSDB\_attach](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-455b1756ef52647e8b9fc9cbc1d6fcd27c9a1608%2FHSDB_attach.png?alt=media)

连接成功后，页面如下：

![HSDB\_attach\_suc](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-40234c28c0ecee3b36fdb407e8123037c963ba63%2FHSDB_attach_suc.png?alt=media)

下面开始查询Class，选择Tools>Class Browser：

![HSDB\_class\_brower](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-bcff68525c0596db10b859affc7d9956cce7790b%2FHSDB_class_brower.png?alt=media)

待Class Brower窗口出现后，在搜索入口填写类的相关信息，进行搜索，为了更加准确，我们输入类的全路径：

![HSDB\_class\_brower\_search](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-5b3458cb3a59f87af68a7cdd94965a99fb23da9e%2FHSDB_class_brower_search.png?alt=media)

很明显，带CGLIB的为我们要的代理类，不带的为原Class对象。

最后，选择Create .class for all classes导出所有Classes。看到下图中的.class created for xxxxx即表示成功了。

![HSDB\_class\_browser\_suc](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-cbd9d982a8076e273d9602076a1c294a25dd13af%2FHSDB_class_browser_suc.png?alt=media)

那么文件在哪里呢，还记得在哪个目录下执行的启动命令吗，文件即在当前目录下，全路径中每个目录都会生成对应的路径，我们按照类路径找下去即可获得。

![HSDB\_OUTPUT](https://1689694876-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8p2GNU9MJ2uKF44ubRqB%2Fuploads%2Fgit-blob-4f875d3dcbf0485ad73819bc7a3984e7f0a73883%2FHSDB_OUTPUT.png?alt=media)
