2013-01-13 2 views
1

Я пишу для большего проекта систему, в которой разные классы регистрируют команды в одном 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 
    } 
} 

ответ

0

Вы запрашиваете аннотацию на классе, но то, что вам запрос ставится на метод. Либо поставить аннотацию на сам класс, либо перечислить его методы (getMethods()) и запросить аннотацию по каждому отдельно. Конечно, то, что вы делаете, зависит от того, что вы хотите.

Также обратите внимание, что аннотации не наследуются для подклассов.

+0

Я нашел путь над полями и методами, так что SetPortPoint имеет имена полей, шаблоны и т. Д., А над абстрактным классом - методы их получения, поэтому теперь у меня есть 1 интерфейс и 1 абстрактный класс. Так что это немного отличается от того, что вы говорите. спасибо – Steven

Смежные вопросы