mc

内存编译器,编译java文件为class文件

命令选项 描述
-c, --classloader <hash> 指定ClassLoader的哈希值
--classLoaderClass <class-name> 指定ClassLoader的类名
-d, --directory <path> 编译存放class目录
--encoding <encoding-name> 源代码编码
-h, --help 帮助
<source-files> 源代码文件

实例

代码1

import java.util.ArrayList;

public class Test1 {
    public void test(){
        new ArrayList<>();
    }
}

代码2

import com.alibaba.arthas.deps.ZZZ;

public class Test2 {
    public void test(){
        new ZZZ();
    }
}
# 直接编译代码1
[arthas@14064]$ mc -d /tmp /tmp/Test1.java
Memory compiler output:
C:\tmp\Test1.class
Affect(row-cnt:1) cost in 37 ms.

# 直接编译代码2
[arthas@14064]$ mc -d /tmp /tmp/Test2.java
Memory compiler error, exception message: Compilation Error
message: 类 Test 是公共的, 应在名为 Test.java 的文件中声明 , line: 3 ,
message: 程序包com.alibaba.arthas.deps不存在 , line: 1 ,
message: 找不到符号
  符号:   类 ZZZ
  位置: 类 Test , line: 5 ,
, please check $HOME/logs/arthas/arthas.log for more details.
# 找到Arthas的ClassLoader再编译
[arthas@14064]$ mc -c 435181e6 -d /tmp /tmp/Test2.java
Memory compiler output:
C:\tmp\Test2.class
Affect(row-cnt:1) cost in 16 ms.

# 编译多个文件
[arthas@14064]$ mc -c 435181e6 -d /tmp /tmp/Test1.java /tmp/Test2.java
Memory compiler output:
C:\tmp\Test1.class
C:\tmp\Test2.class
Affect(row-cnt:2) cost in 20 ms.