J'ai une situation où ma classe Java a besoin de créer une tonne de certains types d'objets. Je voudrais donner le nom de la classe des objets créés en tant que paramètre. De plus, je dois donner un paramètre à la classe créée dans son constructeur. J'ai quelque chose comme
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();
// ..
}
}
Avez-vous des idées pour remédier à cela?
Modifier:
Cela fait partie d'un projet de recherche où nous devons évaluer les performances de plusieurs compresseurs différents avec plusieurs entrées différentes. Class ccos
est une OutputStream
compressée provenant de la bibliothèque standard de Java, Apache Compress Commons ou lzma-Java.
Actuellement, j'ai ce qui suit qui semble bien fonctionner. D'autres idées sont les bienvenues.
OutputStream os = new ByteArrayOutputStream();
OutputStream compressedOut = (OutputStream) ccos.getConstructor(OutputStream.class).newInstance(os);
final InputStream sourceIn = new ByteArrayInputStream(array);
Vous pouvez utiliser la méthode Class.getConstructor(paramsTypes...)
et appeler newInstance(..)
sur le constructeur. Dans ton cas:
Compressor.class.getConstructor(Class.class).newInstance(Some.class);
En utilisant les classes Spring ClassUtils et BeanUtils, vous évitez de vous occuper de ces fastidieuses exceptions, à savoir la gestion de Spring pour vous:
Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class);
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc());
Vous devez accéder à l'objet Constructor
approprié (par exemple, via Class.getConstructors
ou Class.getConstructor
), puis appeler constructor.newInstance
en lui donnant les arguments nécessaires.
Voici un exemple que vous pouvez utiliser: Permet de dire que conn est une connexion à la base de données.
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);
}
btarray vous permet de transmettre des arguments au constructeur.