2012-03-30 18 views
3

動的に生成されたクラスからオブジェクトをインスタンス化:このクラスに基づいて 、私はクラスClass <の新しいインスタンスを作成しようか! getValidator()メソッドによって返されたextends AbstractValidator>私は現在、このような何かを達成しようとしています

public abstract class AbstractEnumDefinition 
     extends AbstractRequestFieldDefinition { 

    private Vector<String> values = new Vector<String>(); 

    public abstract void define(String lang); 

    protected void addEnumDefinition(String value){ 
     values.add(value); 
    } 

    public Vector<String> getValues(){ 
     return values; 
    } 

    @Override 
    public Class<? extends AbstractValidator> getValidator() { 
     return new AbstractValidator() { 
      @Override 
      public boolean isValid(String value) { 
       return values.contains(value); 
      } 

      @Override 
      public String getDefaultValue() { 
       return ""; 
      } 
     }.getClass(); 
    } 
} 

は、私はこのクラスを作成すると言う:

public class LanguageDefinition extends AbstractEnumDefinition { 

    public LanguageDefinition() { 
     super(); 
    } 

    @Override 
    public void define(String language) { 
     addEnumDefinition("BEL-fr"); 
     addEnumDefinition("BEL-nl"); 
     addEnumDefinition("BEL-en"); 
    } 
} 

後の私のコードでは、私はここにインスタンス化しようとしていますクラスはどこにでも宣言しますが、「生成されていません

new LanguageDefinition().getValidator().getConstructor().newInstance() 

呼び出しますAbstractEnumDefinitionクラス内で動的に/動的に作成されます。これをやろうとすると

は、私が手java.lang.InstantiationExceptionため

be....servlets.model.extraction.filter.editor.AbstractEnumDefinition$1 

私は、これは、このクラスが明示的に手の前に作成する必要があり、動的に参照されていないことに起因していると思いますか?

私がバリデータごとに1つのクラスを記述する必要はありませできるようになるソリューションのいくつかの種類がありますか?助けのための

おかげで、

エリック

+0

あなたは*動的に作成したクラス*とはどういう意味ですか?私たちがあなたを理解しているかどうかはわかりません。 – adarshr

+0

はなしのparamコンストラクタのないことかもしれのgetInstance()がこのクラスのために失敗します。つまり、異種のクラスはリフレクションによってインスタンス化できません。 – yggdraa

+0

問題を明確にするために質問を更新しました。ありがとう。 – efj

答えて

2

私はあなたが実際にクラスを使用しているコードが表示されないので、私は唯一の仮定を行うことができますが、あなたがチェックする必要があります:http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException.html

ワンそれが言及していることは、クラスが抽象クラス(抽象クラ​​スをインスタンス化できないため完全に論理的)であるということです。あなたがクラスを返した後、作成したオブジェクトする必要がある理由

また、私は表示されません。 Validatorインターフェイスを定義しておき、メソッドがValidatorオブジェクトを返さないようにしてください。あなたはデフォルトコンストラクタを持っていない可能性がありますので、正しく、動作しませんでも

しかし:私の知る限り、あなたは名前の内部クラスにクラスを変換する必要が匿名クラスでは動作しません

+0

あなたの前提は正しいです。これは実際には抽象的ですが、コード内に定義されたクラスなので、実際にはうまくいくかもしれないという希望がありました。可能であれば、クラス参照とオンデマンドインスタンシエーションのみを使用して、このスコープで実際のオブジェクトを作成しないようにしたかったのです。あなたのソリューションはもちろん動作しますが、とにかく私の唯一の選択肢になると私は信じています。お返事をありがとうございます。 – efj

1

。内部クラスは暗黙のコンストラクタ引数を取得して、囲むクラスへの参照を保持します。残念ながら、静的言語ではClosureがうまく機能しません。囲みクラスのインスタンスの外側をインスタンス化することができない非静的である要約内部クラスで

+0

合意。これは実際にうまくいくかもしれないという野生の希望があった。 実際、デフォルトのコンストラクタを使用しても、インナークラスがインスタンス化されていないと、少なくとも私はその可能性があります。 ご協力いただきありがとうございます。 – efj

関連する問題