1

奇妙なトピック名について申し訳ありませんが、うまく適合するものを見つけることができませんでした。私の問題として、Javaで動的なものを作成したいのですが、これはイベントを取得してスローできる非常に単純なクラスです。悲しいことに、使用しているシステムを作成しているため、各イベントには、イベントが存在する独自のメソッドが必要です。メソッドの引数ですが、良いニュースは、必要な数のイベントリスナークラスを追加できることです。リッスンクラスを追加および削除することにより、リッスンされているメソッドを動的に追加および削除できるようにプログラムを作成します。

私はJavaが苦手ですが、C#でかなりの有効期限が切れているので、そこで行うように問題を攻撃して、このクラスを作成しました。

public class TESPluginDynListener<T> implements Listener {

    TESPlugin plugin;

    public TESPluginDynListener(TESPlugin plugin){
        this.plugin = plugin;
    }

    @EventHandler(ignoreCancelled=false, priority = EventPriority.LOW)
    public void onDynEvent(T event){
        if(event instanceof Event)
            plugin.onEvent((Event)event);
    }
}

これは問題なく機能しているようですが、私の問題は、登録する必要のあるイベントが文字列として取得されることです。たとえば、「some.package.someEvent」のように、それをタイプTに変換する方法がわかりません。リスナークラスを追加します。

では、Tが文字列から変換されるクラスTESPluginDynListenerのインスタンスを作成するにはどうすればよいですか?私はこれをできるだけ動的にしたいので、他の多くのことをすることに興味はありません!

これが私がやろうとしていることのアイデアです

String eventClass = "some.package.someEvent";

TESPluginDynListener listener = new TESPluginDynListener<Type.FromName(eventClass)>(this);
eventhandeler.RegisterListener(listener);
4

1 に答える 1

7

Class.forName探しているようですねClass.newInstance

一方、ジェネリックスの型消去は、Tビルドするために実際に知る必要がないことを意味することに注意しTESPluginDynListenerてください...おそらく、内ではなくClass<T>、コンストラクターを取り込んでTESPluginDynListener使用する必要があります。Class.isInstanceinstanceofonDynEvent

于 2012-11-20T17:54:48.583 に答える