そのため、現在、コマンドライン「オペレーティングシステム」用のプラグインシステム(プラグインはプラグインフォルダーにあるjarファイル)に取り組んでいます。正常に動作しますが、API は動作しません。
プラグインのメイン クラスとイベント クラスを取得するために注釈を使用しています。ただし、注釈が見つからないようです。
これは、プラグインをロードするために使用するものです。
public static void loadPlugin(File file)
{
try
{
URL urlList[] =
{ new File("plugins/" + file.getName()).toURI().toURL() };
URLClassLoader classLoader = new URLClassLoader(urlList);
Class<?> pluginclass, eventclass = pluginclass = null;
String name, version = name = null;
Priority priority = Priority.NORMAL;
String[] classes = Utils.getJarClasses(file, "plugin").toArray(new String[]
{});
for (String s : classes)
{
System.out.println(s);
Class<?> c = classLoader.loadClass(s);
Plugin p = c.getAnnotation(Plugin.class);
EventHandler e = c.getAnnotation(EventHandler.class);
if (p != null)
{
System.out.println("not null!");
pluginclass = c;
name = p.name();
version = p.version();
priority = p.priority();
}
if (e != null)
{
eventclass = c;
}
}
switch (priority)
{
case NORMAL:
plugins.add(new Class<?>[]
{ pluginclass, eventclass });
case DEVELOPER_API:
apis.add(new Class<?>[]
{ pluginclass, eventclass });
}
print("Loaded Plugin: " + name + " V" + version + " with priority " + priority.toString() + ".");
} catch (Exception e)
{
e.printStackTrace();
}
}
現在ループしているクラスを出力していますが、pとeは常に null です。もちろん、バージョンと名前も常に null です。
私の Annotation クラスには が@Retention(RetentionPolicy.RUNTIME)
あります。それが私がここで質問している主な理由です。
同様のシステムをテストしましたが、jar ファイル (代わりにパッケージ内のクラス) を使用せず、正常に動作しました。
前もって感謝します。