接上文javac编译流程(2)处理空值
我们继续查看
try {
argv = CommandLine.parse(ENV_OPT_NAME, argv);
} catch (UnmatchedQuote ex) {
error("err.unmatched.quote", ex.variableName);
return Result.CMDERR;
} catch (FileNotFoundException | NoSuchFileException e) {
warning("err.file.not.found", e.getMessage());
return Result.SYSERR;
} catch (IOException ex) {
log.printLines(PrefixKind.JAVAC, "msg.io");
ex.printStackTrace(log.getWriter(WriterKind.NOTICE));
return Result.SYSERR;
}
这段代码比较简单,跳过包装类,直接进入parse
public static List<String> parse(String envVariable, List<String> args)
throws IOException, UnmatchedQuote {
List<String> inArgs = new ArrayList<>();
//尝试调用System.getenv查看是否有系统附带的Javac参数
appendParsedEnvVariables(inArgs, envVariable);
//将系统Javac参数和我们传入的Javac参数合并
inArgs.addAll(args);
List<String> newArgs = new ArrayList<>();
//尝试查找是否有带@的参数,将其转为文件路径
appendParsedCommandArgs(newArgs, inArgs);
return newArgs;
}
appendParsedCommandArgs方法
private static void appendParsedCommandArgs(List<String> newArgs, List<String> args) throws IOException {
for (String arg : args) {
if (arg.length() > 1 && arg.charAt(0) == '@') {
arg = arg.substring(1);
//这里是避免把类似于@@。。。这样的参数当成@<filename>处理
if (arg.charAt(0) == '@') {
newArgs.add(arg);
} else {
//使用io流获取文件中所有的路径信息,并进行路径转换添加至集合中
loadCmdFile(arg, newArgs);
}
} else {
newArgs.add(arg);
}
}
}
回到compile方法继续进行分析
//通过context对象复用之前的log和Options对象,并创建Arguments对象
Arguments args = Arguments.instance(context);
//对参数进行简单校验
args.init(ownName, argv);
创建Arguments的流程我这里就不做过多的介绍,基本和之前的创建流程一致,先尝试能否从context中获取本类,若不能,创建本类,并将本类对象放入context中,再尝试能否获取所需的成员变量,获取成员变量流程与获取本类流程一致,比较无聊,我们直接进入init
public void init(String ownName, String... args) {
this.ownName = ownName;
errorMode = ErrorMode.LOG;
files = new LinkedHashSet<>();
deferredFileManagerOptions = new LinkedHashMap<>();
fileObjects = null;
classNames = new LinkedHashSet<>();
//真正处理输入参数的方法
//Option.getJavaCompilerOptions()为Option中所有的枚举类型
processArgs(List.from(args