Args4j の
Args4j の version
'2.33'
を
// https://mvnrepository.com/artifact/args4j/args4j compile group: 'args4j', name: 'args4j', version: '2.33'
使い方
Option アノテーションを
@Option(name = "-format", usage = "Format of output ", metaVar = "[console or json]") private Format format = Format.CONSOLE;
- Field の
型を 指定したい Enum に する。 - Handler は
指定しない。
Handler を 指定すると どうなるか?
handler を
@Option(name = "-format", usage = "Format of output ", metaVar = "[console or json]", handler = EnumOptionHandler.class) private Format format = Format.CONSOLE;
この状態で
Caused by: java.lang.IllegalArgumentException: class org.kohsuke.args4j.spi.EnumOptionHandler does not have the proper constructor at org.kohsuke.args4j.OptionHandlerRegistry.getConstructor(OptionHandlerRegistry.java:111) ~[args4j-2.33.jar!/:na] at org.kohsuke.args4j.OptionHandlerRegistry.access$000(OptionHandlerRegistry.java:43) ~[args4j-2.33.jar!/:na] at org.kohsuke.args4j.OptionHandlerRegistry$DefaultConstructorHandlerFactory.<init>(OptionHandlerRegistry.java:217) ~[args4j-2.33.jar!/:na] at org.kohsuke.args4j.OptionHandlerRegistry.createOptionHandler(OptionHandlerRegistry.java:188) ~[args4j-2.33.jar!/:na]
Args4j には、
// registerHandler OptionHandlerRegistry.OptionHandlerFactory factory = (parser, o, setter) -> { // infer the type Class<?> t = setter.getType(); return new EnumOptionHandler(parser,o,setter,t); }; OptionHandlerRegistry.getRegistry().registerHandler(Format.class, factory);
OptionHandlerRegistry#createOptionHandler() の 動作に ついて
以下、createOptionHandler
の
指定されたHandler
を
/** * Creates an {@link OptionHandler} that handles the given {@link Option} annotation * and the {@link Setter} instance. */ @SuppressWarnings("unchecked") protected OptionHandler createOptionHandler(CmdLineParser parser, OptionDef o, Setter setter) { checkNonNull(o, "CmdLineParser"); checkNonNull(o, "OptionDef"); checkNonNull(setter, "Setter"); Class<? extends OptionHandler> h = o.handler(); if(h==OptionHandler.class) { // infer the type Class<?> t = setter.getType(); // enum is the special case if(Enum.class.isAssignableFrom(t)) return new EnumOptionHandler(parser,o,setter,t); OptionHandlerFactory factory = handlers.get(t); if (factory==null) throw new IllegalAnnotationError(Messages.UNKNOWN_HANDLER.format(t)); return factory.getHandler(parser, o, setter); } else { // explicit handler specified return new DefaultConstructorHandlerFactory(h).getHandler(parser, o, setter); } }
OptionHalder をEnumOptionHandler
は、DefaultConstructorHandlerFactory
のgetHandler
メソッドでは、
最初に、
以上です。
コメント