好的,所以我的某个程序有一种命令管理器。 这是一个名为Command的抽象baceclass,非常简单
public abstract class Command {
protected String commandheader;
protected int requiredlevel;
protected Random rand;
public Command(RANK rank,String command)
{
commandheader = command;
requiredlevel = rank.level;
}
}
然后在继承这个的每个类中,我只是一些oop magic。
public class MyCommand extends Command {
public MyCommand()
{
super(RANK.PLAYER,"blablabla");
}
}
然后我还有一个命令助手类,它将每个命令保存在一个列表中,这样我就可以轻松找到命令,当我传入命令时是否有效,以及获取所有可用命令的lsit。
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.");
}
}
}
截至目前,该系统完全正常。但它有一个缺陷,对于我或其他编辑添加的每个命令,我们必须手动将其添加到列表中,这似乎很乏味,并且可能导致我们同步文件时出现问题。所以我想知道,有什么办法我可以将每个命令添加到列表而不必手动将它放在那里?也许注释我的方法,或者只是将它添加到列表中?我看到了一些关于反射的东西,但我不认为这是我想要的,尽管我不确定。我之前从未使用也没有做过注释,所以我不确定天气是否合理。
答案 0 :(得分:1)
如果这就是你真正想要做的事情,你可以做这样的事情......
声明你的注释
@Target (ElementType.TYPE)
@Retention (RetentionPolicy.RUNTIME)
public @interface CommandAnnotation {
}
注释您的命令
@CommandAnnotation
public class MyCommand {
然后检查他们这样的东西
...
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;