2010-12-08 23 views
15

Java sınıfımın belirli türde nesneler oluşturması gereken bir durum var. Parametre olarak oluşturulan nesnelerin sınıfının adını vermek istiyorum. Ayrıca, oluşturulan sınıfı yapıcısına bir parametre vermem gerekiyor. Ben bu sorunu nasıl çözebileceğime dair herhangi bir fikriniz var mı?Kurucu parametresi olan Class'tan yeni örnek oluşturma

Düzenleme:

Biz birden farklı girişlere sahip birden farklı kompresörün performansını değerlendirmek için gereken bir araştırma projesinin bir parçasıdır. Class ccos, Java'nın standart kitaplığından, Apache Compress Commons veya lzma-java'dan sıkıştırılmış bir OutputStream'dir.

Şu anda düzgün çalışıyor gibi görünen aşağıdakilere sahibim. Diğer fikirler açığız.

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

Neden anlatmak gerekiyor 'nesnelerin Compressor' ne tür oluşturmak için? Burada ne tür sınıflar kullanılacak? –

+1

Yansımalar ile kesmek yerine bunun için soyut bir fabrika kullanmayı düşündünüz mü? –

+0

bazı daha fazla bilgi eklemek için düzenlenmiş – lhahne

cevap

16

Class.getConstructor(paramsTypes...) yöntemini kullanabilir ve yapıcıda newInstance(..) numaralı telefonu arayabilirsiniz. Senin durumunda şu şekildedir:

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

Bence Compressor.class.getConstructor (Class.class) .newInstance (someparameter); ' – lhahne

+1

@lhahne de, parametreniz' Class' türündeyse, 'Some.class' olabilir – Bozho

+0

Basit örnek: CreateObjects bir java sınıfıdır, kurucu için herhangi bir argüman olmaksızın aşağıdaki şekilde newInstance'ı çağırabilir. 'CreateObjects obj2 = CreateObjects.class.getConstructor() newInstance();' – srinivas

1

Sen (örn Class.getConstructors veya Class.getConstructor aracılığıyla) İlgili Constructor nesneye almak ve daha sonra bunu gerektiriyorsa argümanlar vererek constructor.newInstance aramalıyız.

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

bunu istemedim – lhahne

0

kullanabileceğiniz bir örnek: bağl veritabanına bir bağlantı olduğunu varsayalım. btarray, argümanları yapıcıya iletmenizi sağlar. Bahar sizin için taşıma kullanılabilir olanlar sıkıcı istisnalar ile ilgili önleyebilirsiniz

3

kullanma Bahar ClassUtils ve BeanUtils sınıfları:

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