2010-12-08 12 views
15

Ich habe Situation, wo meine Java-Klasse eine Tonne bestimmter Art von Objekten erstellen muss. Ich möchte den Namen der Klasse der Objekte angeben, die als Parameter erstellt werden. Außerdem muss ich der erstellten Klasse einen Parameter in ihrem Konstruktor geben. Ich habe so etwas wieErstellen einer neuen Instanz aus Klasse mit Konstruktorparameter

class Compressor { 

    Class ccos; 

    public Compressor(Class ccos) { 
     this.ccos = ccos; 
    } 

    public int getCompressedSize(byte[] array) { 
     OutputStream os = new ByteArrayOutputStream(); 
     // the following doesn't work because ccos would need os as its constructor's parameter 
     OutputStream cos = (OutputStream) ccos.newInstance(); 
     // .. 
    } 
} 

Haben Sie irgendwelche Ideen, wie ich das beheben könnte?

Edit:

Dies ist Teil eines Forschungsprojektes ist es, wo wir die Leistung mehrerer verschiedenen Verdichter mit mehreren verschiedenen Eingängen bewerten müssen. Class ccos ist eine komprimierte OutputStream entweder von Java-Standard-Bibliothek, Apache Compress Commons oder lzma-Java.

Derzeit habe ich folgendes, das scheint gut zu funktionieren. Andere Ideen sind willkommen.

OutputStream os = new ByteArrayOutputStream(); 
OutputStream compressedOut = (OutputStream) ccos.getConstructor(OutputStream.class).newInstance(os); 
final InputStream sourceIn = new ByteArrayInputStream(array); 
+0

Warum brauchen Sie zu sagen 'Compressor' welche Art von Objekten zu schaffen? Welche Arten von Klassen werden hier verwendet? –

+1

Haben Sie darüber nachgedacht, eine abstrakte Fabrik zu verwenden, anstatt sie mit Reflexionen zu hacken? –

+0

bearbeitet, um weitere Informationen hinzuzufügen – lhahne

Antwort

16

Sie können die Methode verwenden und newInstance(..) auf dem Konstruktor aufrufen. In Ihrem Fall:

Compressor.class.getConstructor(Class.class).newInstance(Some.class); 
+1

Ich denke du meinst 'Compressor.class.getConstructor (Class.class) .newInstance (someparameter);' – lhahne

+1

@lhahne Nun, da Ihr Parameter vom Typ 'Class' ist, kann es' Some.class' sein – Bozho

+0

Einfaches Beispiel: CreateObjects ist eine Java-Klasse, kann newInstance auf die folgende Weise ohne Argumente für Konstruktor aufrufen. 'CreateObjects obj2 = CreateObjects.class.getConstructor(). NewInstance();' – srinivas

1

Sie müssen die entsprechenden Constructor Objekt erhalten (zum Beispiel über Class.getConstructors oder Class.getConstructor) und dann constructor.newInstance nennen es die Argumente geben es erfordert.

-1
class Compresor<T> { 
    private Class<? extends T> clazz; 
    Compresor(final Class<? extends T> cls){ 
     this.clazz = cls 
    } 
} 
+0

das ist nicht, was ich gefragt habe – lhahne

0

Ein Beispiel Sie verwenden können, ist wie folgt: können sagen, conn eine Verbindung zur Datenbank ist.

Class[] btarray = { conn.getClass() };  
try{ 
if (classname != null) { 
pmap = (Mapper) Class.forName(
classname).getConstructor(btarray).newInstance(
new Object[] { conn }); 
} 
} catch (Throwable x) { 
    x.printStackTrace(Log.out); 
} 

Mit btarray können Sie Argumente an den Konstruktor übergeben.

3

mit Spring ClassUtils und BeanUtils Klassen können Sie vermeiden, mit diesen langweiligen Ausnahmen handelt, die Feder für Sie ist die Handhabung:

Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class); 
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc()); 
Verwandte Themen