2017-12-17 11 views
1

メインメソッドを持つ抽象クラスを作成し、それを拡張した開発者がmainメソッドを実装する必要がないようにします。私はまた、メインメソッドで何が起こるかをコントロールしたい。現在の実際のクラスを静的メインメソッドにアクセスする方法

私が作成している抽象基本クラスはNanoHTTPDを拡張し、実行するクラスの型のクラスオブジェクトであるパラメータでServerRunner.run()を呼び出してサーバーを起動します。ここで

は、私がこれまで持っているものです。

public abstract class FlexibleServer extends NanoHTTPD 
{ 
    public DeadSimpleMicroserver(int port) 
    { 
     super(port); 
    } 

    public static void main(String[] args) 
    { 
     ServerRunner.run(FlexibleServer.class); 
    } 
} 

問題は、このクラスが抽象的であることから、将来の開発者がクラスを拡張することになるので、私はの実際の型であることをServerRunner.run()にパラメータを必要とするということですサブクラスなので、FlexibleServer.classを使用することはできません。

パラメータをthis.classに変更しようとしましたが、コンパイルエラーが発生しました。「this」は静的コンテキストから参照できません(main()は静的です)。

実際のサブクラスのクラスオブジェクトを得る方法は、main()ですか?

答えて

1

実行時に渡すクラスが動的な場合は、ハードコードされたクラス名で呼び出すことはできません。 runに呼び出しを変更して、実際のクラスのインスタンスを渡すか、mainメソッドの引数などの指定されたクラスを動的にロードする必要があります。

上記の変更により、問題は解決されます。例えば

、あなたが動的にクラスをロードしている場合:

ServerRunner.run(Class.forName(args[0])); 

アプリは、実際のクラス名で呼ばれると仮定。

代替は、クラス名、インスタンス、またはクラスのオブジェクトのいずれかが呼び出し元

0

によって渡され、私は一度に働いていたフレームワークは、このような基本クラスを持っていた、と私たちはメソッドを追加するようにコードを再設計が含ま

public abstract class FrameworkServer { 
    // framework stuff 

    protected static void main(String[] args, FrameworkServer instance) { 
     // parse args 
     // actually start the instance running 
    } 
} 

、特定のサーバインスタンスはそうのような独自のmainメソッドを追加する必要があります。このよう

final class MyServer extends FrameworkServer { 
    public static void main(String[] args) { 
     main(args, new MyServer()); 
    } 
} 

小さなビットがありますここには各サーバーの定型文がありますが、これはリフレクションを避け、コードをもっとはっきりさせることを可能にします。ボーナスとして、具体的なサブクラスは独自の引数をサーバのコンストラクタに追加できるようになりました。これはしばしばユニットテストに非常に便利です。

関連する問題