2012-03-30 16 views
3

Ich versuche derzeit, etwas wie folgt zu erreichen: Basierend auf dieser Klasse, versuche ich eine neue Instanz der Klasse < zu erstellen? erweitert AbstractValidator> zurückgegeben von der Methode getValidator().Instanziieren Sie ein Objekt aus einer dynamisch generierten Klasse

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(); 
    } 
} 

sagen, dass ich diese Klasse zu erstellen:

public class LanguageDefinition extends AbstractEnumDefinition { 

    public LanguageDefinition() { 
     super(); 
    } 

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

Später in meinem Code, ich nenne

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

Die Klasse ich hier zu instanziiert versuche nicht überall erklärt, sondern „erzeugt dynamisch "/" dynamisch erstellt "innerhalb der AbstractEnumDefinition-Klasse.

Beim Versuch, dies zu tun, erhalte ich eine java.lang.InstantiationException für

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

Ich denke, dies ist auf die Tatsache zurückzuführen ist, dass diese Klasse ausdrücklich vor der Hand erstellt werden muss, und nicht dynamisch referenziert?

Gibt es eine Lösung, die es mir erlaubt, nicht eine Klasse pro Validator schreiben zu müssen?

Danke für die Hilfe,

Eric

+0

Was meinst du mit * dynamisch erstellte Klasse *? Wir sind nicht sicher, ob wir Sie dort verstehen. – adarshr

+0

Möglicherweise Abwesenheit von No-Param-Konstruktor macht die GetInstance() für diese Klasse fehlschlagen. Und das bedeutet, dass anonyme Klassen nicht durch Reflexion instanziiert werden können. – yggdraa

+0

Nur die Frage aktualisiert, um die Dinge zu klären. Vielen Dank. – efj

Antwort

2

kann ich nur Vermutungen anstellen, da ich in dem Sie den Code nicht sehen, sind die Klasse tatsächlich verwenden, aber sollten Sie prüfen: http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException.html

One Was es erwähnt, ist die Instanziierung kann fehlschlagen ist die Klasse ist eine abstrakte Klasse (vollkommen logisch, da Sie abstrakte Klassen nicht instantiieren können).

Auch ich sehe nicht, warum Sie die Klasse zurückgeben und dann erstellen und ablegen müssen. Warum definieren Sie nicht einfach eine Validator-Schnittstelle und lassen Sie Ihre Methode ein Validator-Objekt zurückgeben.

+0

Ihre Annahmen sind richtig. Ich hatte eine wilde Hoffnung, dass dies tatsächlich funktionieren könnte, da es tatsächlich eine abstrakte, aber definierte Klasse innerhalb des Codes ist. Ich wollte die eigentliche Objekterzeugung in diesem Bereich möglichst vermeiden, indem ich nur Klassenreferenzen und On-Demand-Instanziierung verwende. Ihre Lösung wird natürlich funktionieren, und ich glaube, es wird sowieso meine einzige Option sein. Danke für deine Antwort. – efj

1

, das für anonyme Klassen nicht so weit arbeiten, wie ich weiß, haben Sie Ihre Klasse zu einer benannten inneren Klasse konvertieren:

Aber auch das wird nicht funktionieren, richtig, weil Sie nicht über einen Standardkonstruktor haben könnten. Innere Klassen erhalten implizite Konstruktorargumente, um den Verweis auf die umschließende Klasse beizubehalten. Leider funktionieren Closures in statischen Sprachen nicht so gut.

Zusammenfassend können innere Klassen, die nicht statisch sind, nicht außerhalb einer Instanz der umschließenden Klasse instanziiert werden.

+0

Einverstanden. Ich hatte eine wilde Hoffnung, dass dies tatsächlich funktionieren könnte. In der Tat, auch mit dem Standardkonstruktor, instanziieren eine innere Klasse funktioniert nicht, zumindest wie ich hoffe hatte. Danke für Ihre Hilfe. – efj

Verwandte Themen