编译保留方法参数名字
javac 文档
-parameters
Stores formal parameter names of constructors and methods in the generated class file so that the method java.lang.reflect.Executable.getParameters from the Reflection API can retrieve them.
获取动态编译支持的参数列表
反射获取参数名这个问题本身和解决的方法很简单,但动态编译相关资料和问题不多,也没有找到介绍动态编译时 options 相关参数的文章和问题,此处做一下记录,方便参考 。
调用 JavaCompiler 接口的 getTask 方法时,可以使用参数 options
CompilationTask getTask(Writer out,
JavaFileManager fileManager,
DiagnosticListener super JavaFileObject> diagnosticListener,
Iterable options,
Iterable classes,
Iterable extends JavaFileObject> compilationUnits);
参数列表
获取 option 参数列表的方法如下
断点打在 processArgs 方法上,执行 Evaluate Expression 片段 com.sun.tools.javac.main.Main.processArgs 此处类引用和参数类型出现缺失,IDE 报红,不能在一行完成循环打印
for (int p=0;p
System.out.print(recognizedOptions[p].name);
System.out.print("\t");
System.out.print(recognizedOptions[p].text);
System.out.print("\t");
System.out.print(recognizedOptions[p].descrKey+"");
System.out.print("\t");
System.out.print(recognizedOptions[p].group.name+"");
System.out.print("\t");
System.out.printf(recognizedOptions[p].kind.name+"");
System.out.println();
}
recognizedOptions
输出
共有61个参数,第二列是 option 参数名称和格式,详细释义和 demo 见开头的 javac 官方文档
G-gopt.gBASICSTANDARD
G_NONE-g:noneopt.g.noneBASICSTANDARD
G_CUSTOM-g:opt.g.lines.vars.sourceBASICSTANDARD
XLINT-Xlintopt.XlintBASICEXTENDED
XLINT_CUSTOM-Xlint:opt.Xlint.suboptlistBASICEXTENDED
XDOCLINT-Xdoclintopt.XdoclintBASICEXTENDED
XDOCLINT_CUSTOM-Xdoclint:opt.Xdoclint.customBASICEXTENDED
NOWARN-nowarnopt.nowarnBASICSTANDARD
VERBOSE-verboseopt.verboseBASICSTANDARD
DEPRECATION-deprecationopt.deprecationBASICSTANDARD
CLASSPATH-classpathopt.classpathFILEMANAGERSTANDARD
CP-cpopt.classpathFILEMANAGERSTANDARD
SOURCEPATH-sourcepathopt.sourcepathFILEMANAGERSTANDARD
BOOTCLASSPATH-bootclasspathopt.bootclasspathFILEMANAGERSTANDARD
XBOOTCLASSPATH_PREPEND-Xbootclasspath/p:opt.Xbootclasspath.pFILEMANAGEREXTENDED
XBOOTCLASSPATH_APPEND-Xbootclasspath/a:opt.Xbootclasspath.aFILEMANAGEREXTENDED
XBOOTCLASSPATH-Xbootclasspath:opt.bootclasspathFILEMANAGEREXTENDED
EXTDIRS-extdirsopt.extdirsFILEMANAGERSTANDARD
DJAVA_EXT_DIRS-Djava.ext.dirs=opt.extdirsFILEMANAGEREXTENDED
ENDORSEDDIRS-endorseddirsopt.endorseddirsFILEMANAGERSTANDARD
DJAVA_ENDORSED_DIRS-Djava.endorsed.dirs=opt.endorseddirsFILEMANAGEREXTENDED
PROC-proc:opt.proc.none.onlyBASICSTANDARD
PROCESSOR-processoropt.processorBASICSTANDARD
PROCESSORPATH-processorpathopt.processorpathFILEMANAGERSTANDARD
PARAMETERS-parametersopt.parametersBASICSTANDARD
D-dopt.dFILEMANAGERSTANDARD
S-sopt.sourceDestFILEMANAGERSTANDARD
H-hopt.headerDestFILEMANAGERSTANDARD
IMPLICIT-implicit:opt.implicitBASICSTANDARD
ENCODING-encodingopt.encodingFILEMANAGERSTANDARD
SOURCE-sourceopt.sourceBASICSTANDARD
TARGET-targetopt.targetBASICSTANDARD
PROFILE-profileopt.profileBASICSTANDARD
VERSION-versionopt.versionINFOSTANDARD
FULLVERSION-fullversionnullINFOHIDDEN
DIAGS-XDdiags=nullINFOHIDDEN
HELP-helpopt.helpINFOSTANDARD
A-Aopt.ABASICSTANDARD
X-Xopt.XINFOSTANDARD
J-Jopt.JINFOSTANDARD
MOREINFO-moreinfonullBASICHIDDEN
WERROR-Werroropt.WerrorBASICSTANDARD
PROMPT-promptnullBASICHIDDEN
DOE-doenullBASICHIDDEN
PRINTSOURCE-printsourcenullBASICHIDDEN
WARNUNCHECKED-warnuncheckednullBASICHIDDEN
XMAXERRS-Xmaxerrsopt.maxerrsBASICEXTENDED
XMAXWARNS-Xmaxwarnsopt.maxwarnsBASICEXTENDED
XSTDOUT-Xstdoutopt.XstdoutINFOEXTENDED
XPRINT-Xprintopt.printBASICEXTENDED
XPRINTROUNDS-XprintRoundsopt.printRoundsBASICEXTENDED
XPRINTPROCESSORINFO-XprintProcessorInfoopt.printProcessorInfoBASICEXTENDED
XPREFER-Xprefer:opt.preferBASICEXTENDED
XPKGINFO-Xpkginfo:opt.pkginfoBASICEXTENDED
O-OnullBASICHIDDEN
XJCOV-XjcovnullBASICHIDDEN
PLUGIN-Xplugin:opt.pluginBASICEXTENDED
XDIAGS-Xdiags:opt.diagsBASICEXTENDED
XD-XDnullBASICHIDDEN
AT@opt.ATINFOSTANDARD
SOURCEFILEsourcefilenullINFOHIDDEN
验证参数名字
粗略验证,如果输出的参数名不是 arg0 和 arg1 这种格式则说明设置生效
Stream.of(clz.getDeclaredMethods()).forEach(
method -> {
Stream.of( method.getParameters()).forEach(
parameter -> {
System.out.printf("%s( %s,%s,%s)\n",method.getName(),parameter.getName(),
parameter.getRealName(),parameter.isVarArgs());
}
);
}
);