2014-07-09 3 views
0

Ok, donc j'ai une sorte de gestionnaire de commandes pour un de mes programmes. Theres une baceclass abstraite appelée commande qui est, très simpleComment faire une annotation, qui ajoute toutes les classes de ce type à une liste

public abstract class Command { 

    protected String commandheader; 
    protected int requiredlevel; 
    protected Random rand; 
    public Command(RANK rank,String command) 
    { 
     commandheader = command; 
     requiredlevel = rank.level; 
    } 
} 

ensuite dans chacune des classes qui héritent cela, je viens donc un peu de magie oop.

public class MyCommand extends Command { 

    public MyCommand() 
    { 
     super(RANK.PLAYER,"blablabla"); 
    } 
} 

Puis j'ai aussi une classe d'aide de commande, qui maintient chacune de ces commandes dans une liste donc je peux facilement trouver si la commande est valide quand je passe dans, aswell comme obtenir un lsit de toutes les commandes qui sont disponibles.

public class CommandHelper { 
    public enum RANK{ 
     PLAYER(0); 
     public int level; 

     private RANK(int i) 
     { 
      level = i; 
     } 
    } 
    static List<Command> commandlist; 

    private static void initTheCommands() 
    { 
     //Add the commands to the list here. 
     commandlist.add(new MyCommand()); 
    } 

    //Called by my main class 
    public static void Init() 
    { 
     if(commandlist == null) 
     { 
      //Were safe to initalise the stuff brah. 
      commandlist = new ArrayList<Command>(); 
      initTheCommands(); 
      for(Command cmd : commandlist) 
      { 
       System.out.println("Loaded command: " + cmd.commandheader); 
      } 
      System.out.println("[INFO] Initalised the command helper"); 
     } 
     else 
     { 
      System.out.println("[INFO] Command list is already populated."); 
     } 
    } 
} 

En ce moment, ce système fonctionne parfaitement. Mais il y a un défaut, pour chaque commande ajoutée par les autres éditeurs, nous devons l'ajouter manuellement à la liste, ce qui peut sembler fastidieux et entraîner des problèmes de synchronisation des fichiers. Donc je me demandais, est-il possible que je puisse ajouter chaque commande à la liste sans avoir à la mettre manuellement là? Peut-être annoter ma méthode, ou quelque chose pour l'ajouter à la liste? J'ai vu quelque chose à propos de la réflexion, mais je ne pense pas que ce soit ce que je veux exactement même si je n'en suis pas sûr. Iv n'a jamais utilisé ni fait d'annotations avant donc je ne suis pas sûr de la météo ou non, c'est plausible.

Répondre

1

Si c'est ce que vous voulez vraiment faire, vous pouvez faire quelque chose comme ça ...

Déclarez votre annotation

@Target (ElementType.TYPE) 
@Retention (RetentionPolicy.RUNTIME) 
public @interface CommandAnnotation { 
} 

annoter vos commandes

@CommandAnnotation 
public class MyCommand { 

Vérifiez ensuite pour eux quelque chose comme ceci

... 
import org.reflections.Reflections; 
... 
public void loadCommands() { 

    Reflections reflections = new Reflections("com.my.package"); 
    Set<Class<?>> allClasses = reflections.getSubTypesOf(Command.class); 

    for (Class<?> outerClazz : allClasses) { 
     CommandAnnotation annotation = outerClazz.getAnnotation(CommandAnnotation.class); 
     if (annotation == null) 
      continue; 
+0

Ok, donc j'ai essayé de l'ajouter, comment est-ce que ça se met exactement dans la liste? commandlist.add (outerClazz) ;? aucune idée. –

+0

Mes excuses. Je suppose que vous avez eu accès à Internet et le désir d'apprendre. Vous pourriez vouloir google ce que vous pouvez faire avec un objet de classe. – TedTrippin

+0

http://gyazo.com/a7512049cbc930a482a9edc34e1349f6 ne peux toujours pas faire les choses correctement. Je ne suis pas bon avec types. –

Questions connexes