web-dev-qa-db-fra.com

Création d'une nouvelle instance à partir de la classe avec le paramètre constructeur

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);
15
lhahne

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);
16
Bozho

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());
3
lisak

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.

1
NPE

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.

0
leroneb