1

Java オブジェクトをインスタンス化する具体的な方法について質問があります。

基本的に、インターフェイスを実装するシングルトンを実装する必要があります。私は現在、ファクトリと少しのリフレクションを使用して、この例を再現しようとしています(正確には 5 番目の投稿)。

私が気に入っている部分は、この方法により、Singleton の実装を非常に簡単に変更できることです。

問題は、クラス名を取得する方法がよくわからないことです。上記の例では、System.getProperty()これを行う方法のように見えますが、この例では、これを行うために必要なすべての型が正確に示されているわけではありません (フィールドは型指定されていません)。getProperty()問題は、メソッドにどのキーを与えるべきかわからないことです。.type を使用したシングルトンのプライベート静的フィールドの名前 (つまりmySingleton.name) である必要があるようですが、機能していないようです...

クラス名を取得する方法を知りたいです。

ところで、これを行うためのより良い方法があれば、提案をお待ちしています。

4

3 に答える 3

1

typeNameはStringです。したがって、必要なのは、クラスにリフレクションをロードするための完全修飾クラス名です。

クラスタイプ=Class.forName(typeName);

System.getProperty()は、プログラムの実行時に持っているシステムプロパティ/環境プロパティにアクセスする方法です。例を使用して絞り込むには、次のようにシステム変数を設定できます。Windowsの場合:

cmd> set a.type = mytest.testclass

Linuxの場合:

$ export a.type = mytest.testclass

ロードしようとしているクラスがクラスパスにあるようにします。

プログラムを実行する前に実行する必要がある上記の手順。

ベストプラクティスになると、上記のアプローチを使用してプログラムをテストできますが、リアルタイムソリューションを使用する場合は、ファイルまたはデータベースからこれらのクラス名を読み取る方法がおそらくあります。おそらく、ある種の構成パラメーターです。

于 2012-08-13T09:57:53.680 に答える
1

でお尋ねの場合String typeName = System.getProperty("a.type");

private synchronized static final void createA()
{
    // This is just one possibility for getting the class name.
    String typeName = System.getProperty("a.type");
    Class type = Class.forName(typeName);
    a = type.newInstance();
}

どこa.typeから来たの?- これは、この目的のためだけにオペレーティング システムで宣言された単なるシステム プロパティです。

Class c = Class.forName("java.lang.String");

上記のように -Class.forName()クラスの完全修飾名が必要 - パッケージ宣言あり

于 2012-08-13T09:45:44.740 に答える
0

プロパティは好きなものにすることができます。でプロパティを取得でき、System.getProperty("my.property")これを次のクラスに変換できます。Class.forName()

おそらく、すべてが非常に単純であるため、うまくいかなかったことを言うことができます。私は、あなたがほぼ正しいことをしていると思います。

于 2012-08-13T09:48:13.287 に答える