1

そのため、現在、コマンドライン「オペレーティングシステム」用のプラグインシステム(プラグインはプラグインフォルダーにある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();
    }
}

現在ループしているクラスを出力していますが、peは常に null です。もちろん、バージョン名前も常に null です。

私の Annotation クラスには が@Retention(RetentionPolicy.RUNTIME)あります。それが私がここで質問している主な理由です。

同様のシステムをテストしましたが、jar ファイル (代わりにパッケージ内のクラス) を使用せず、正常に動作しました。

前もって感謝します。

4

1 に答える 1