Я пишу для большего проекта систему, в которой разные классы регистрируют команды в одном CommandHandler. Команды - это классы с кодом для выполнения.
Моя проблема: CommandHandler нуждается в некоторой информации по классам, имени, разрешениям и использованию.Информация о классе
Я уже пробовал с @interfaces, но это всегда дает мне null. Должен ли я сделать это по-другому или я могу это исправить?
Код: Регистр в CommandHandler
public void register(Class<? extends Command> c) {
CommandInfo info = c.getAnnotation(CommandInfo.class);
if (info == null) return;
try {
commands.put(info.pattern(), c.newInstance());
}
catch (Exception e) {
e.printStackTrace();
}
}
@CommandInfo
@Retention(RetentionPolicy.RUNTIME)
public @interface CommandInfo
{
/**
* The actual name of the command. Not really used anywhere.
*/
public String name();
/**
* A regex pattern that allows minor oddities and alternatives to the
* command name.
*/
public String pattern();
/**
* The usage message, i.e. how the command should be used.
*/
public String usage();
/**
* A description of what the command does.
*/
public String desc();
/**
* The permission required to execute this command.
*/
public String permission();
}
И одна команда:
public class SetPortPoint implements Command
{
@CommandInfo(
name = "setportpoint",
pattern = "setportpoint|spp",
usage = "/maa setportpoint <arena> <wavenumber>",
desc = "set a Port point for a Arena at a given Wave",
permission = "mobarenaaddon.porter.setportpoint"
)
public boolean execute(){
//The Code to do
}
}
Я нашел путь над полями и методами, так что SetPortPoint имеет имена полей, шаблоны и т. Д., А над абстрактным классом - методы их получения, поэтому теперь у меня есть 1 интерфейс и 1 абстрактный класс. Так что это немного отличается от того, что вы говорите. спасибо – Steven