1

静的ブロックでハッシュマップを初期化したクラスがあります。キーを渡して、クラスである値を取得しました。このクラスのオブジェクトを作成するため。コンストラクター クラスを使用してコンストラクターを取得し、引数を渡してオブジェクトを作成しました。

ハッシュマップに2つのクラスがあります。EchoExpression のオブジェクトを作成するには、2 つの引数を渡す必要があり、OutExpression クラスには 1 つの引数 (文字列) のみを渡す必要があります。

  1. キーによって返されたクラスに基づいて、取得して実装するコンストラクターを実行する必要があります。これは、引数が 1 つまたは 2 つのコンストラクターのどちらでもかまいません。

  2. EchoExpression では、コンストラクターに 2 つの引数が含まれます。

例えば:

JXPathExpression check = new JXPathExpression(String expression, Class<?> type)

String は String.class に属しますが、Class 型引数もどのクラスに属しますか? コンストラクターを取得する際に使用できるように

public class ExampleFactory {

    private static HashMap<String,Class<?>> hmap = new HashMap<String,Class<?>>();

    static
    {                   
        hmap.put("echo", EchoExpression.class);         
        hmap.put("Out", OutExpression.class);                       
    }

    public void getExpo(String key,String expression)
      {
        Class aClass =map.get(key);

//Constructor implementation for OutExpression where only one argument string is passed

        Constructor constructor = aClass.getConstructor(new Class[]{String.class});

        Object object= constructor.newInstance(expression);

//Need constructor for passing two arguments string and class<?> for EchoExpression

        return null;        
      }                
}
4

2 に答える 2

2

そのようなことのために、すべての場合において、統一されたコンストラクターパラメーターを持つか、クラスごとにパラメーターを保存する方法を試してください。

それでは、ご質問を。Class<?>不明なクラスへの参照です。基本的にどのクラスでも構いません。Class<Object>それを使用する場合、すべてのクラスがObject親として取得されるため、ほぼ同じです。

複数の引数を持つコンストラクターを使用するには、最初に適切なコンストラクターをフェッチする必要があります。この時点で、クラスがこの引数構成のインスタンスをサポートしていない場合に発生するエラーをフェッチすることはすでに可能です。コンストラクターのフェッチは次のように機能します。

aClass.getConstructor(new Class[]{String.class, Object.class, ...});

これは、好きなだけ多くの引数タイプで機能します。クラスの新しいインスタンスを作成すると、次のように機能します。

constructor.newInstance(theString, theObject, ...);

関数newInstanaceは、必要な数の引数を実装します。したがって、要求されたコンストラクターが必要とする引数の数に応じて、newInstance関数はそれを操作できます。

あなたが意図しているすべてのことについて...おそらく提案:おそらく、リフレクションを使用して新しいオブジェクトをロードするのではなく、それらのオブジェクトのインスタンスを保存し、コピーコンストラクタまたはcloneメソッドを使用して作成されたオブジェクトのコピーを返すオプションです。多くの場合、実行するのはそれほど難しくありません。

于 2012-04-04T21:54:45.303 に答える
1

おそらくあなたが探しているのは、次のような Class.class です。

Constructor constructor = aClass.getConstructor(new Class[]{String.class, Class.class});
于 2012-04-04T21:40:54.420 に答える