java8 parameters_java8 动态编译保留方法参数名字

编译保留方法参数名字

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());

}

);

}

);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值