2011-01-27 17 views
10

Bir java.util.ArrayList Yansıtmayı Kullanarak Genel Sınıf ile Nasıl Örneklendirilir? Java.util.List öğesini hedef nesneye koyan bir yöntem yazıyorum. Bir hedef nesne ve listenin bir genel tür çalışma zamanı içinde bilmektir:Bir java.util.ArrayList Yansıtmayı Kullanarak Genel Sınıf ile Örnekleme Nasıl Yapılır

public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) { 
    try { 
     Class clazz = Class.forName("java.util.ArrayList<"+gtype+">"); 
     Object newInstance = clazz.newInstance(); 
     prop.getWriteMethod().invoke(targetObject, newInstance); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

cevap

13

Bir nesneyi yürütülmesi sırasında onun jenerik türü hakkında bilmiyor. Sadece ham tipin yeni bir örneğini oluşturun (java.util.ArrayList). Hedef nesne farkı bilmez (çünkü , arasında bir fark yoktur).

Temel olarak Java generic, derlenmiş sınıflarda meta veriler içeren, ancak yürütme zamanında yalnızca bir derleme zamanıdır. Daha fazla bilgi için Java generics FAQ'a bakın.

+0

sadece yinelenen yanıtlar oluşturmadığı için, yansımayı kullanmak tıpkı yeni ArrayList () işlevini kullanmak gibidir. Çünkü "jenerik sınıf", çalışma zamanında "Object" olarak yorumlanır. –

2

Generics bir derleme zamanı "trick" dir.

Yansıma yalnızca çalışma zamanıdır.

Temel olarak, yapamazsınız - yalnızca "ham" ArrayList oluşturabilirsiniz. Bunu, genel parametreleri alan yöntemlere aktarmanız gerekiyorsa, doğrudan inşasından sonra döküm yapmak güvenli olacaktır ("işaretlenmemiş" uyarıdan bağımsız olarak). Bu örnekte, genel Objects kullanımı nedeniyle derleme zamanı türü güvenliği yoktur, dolayısıyla döküm gerekmez.

+0

Generics, yalnızca bir derleme zamanı değildir. Alan, yöntem ve sınıf tanımlarındaki beton tipi parametreler bayt kodunda bulunur ve çalışma zamanında yansıma yoluyla elde edilebilir. –

0

Genel değerler yalnızca derleme zamanında çalışır; bu nedenle yansıma kullanıyorsanız, bunlar kullanılamaz.

Bu here ile ilgili daha fazla bilgi edinin.

0

Bir nesne, yürütme zamanında genel türünü bilmez. Sadece ham türün yeni bir örneğini oluşturun (java.util.ArrayList). Hedef nesne farkı bilmez (çünkü herhangi bir fark yoktur).

0

Generics büyük ölçüde bir derleme zamanı özelliğidir. Ne yapmaya çalışıyorsun

public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) { 
    prop.getWriteMethod().invoke(targetObject, new ArrayList()); 
} 

Not aynıdır: Bu Listesini oluşturmak için herhangi bir yansımayı yapmaya gerek yoktur Java 7.

6

yılında Türleri ile değişebilir. Sadece bazı ek tip bilgileri (genellikle doğru türde bir sınıf geçerek yapılır) geçmek.

public static <T> List<T> createListOfType(Class<T> type) { 
    return new ArrayList<T>(); 
} 

Şimdi de muhtemelen/umarım herhangi yansıma olmadan targetObject doğrudan ayarlayabilirsiniz gerekli türden bir listesi var.

+0

Teşekkürler. benim için çalışmaları –

İlgili konular