2012-11-15 12 views
22

İşte bir Class<?> cls değişken, şimdi cls olan bir bileşen türü Array Class Object almak istiyorum.: get `String []. Class` from String.class`, String.class` bir" çalışma zamanı türü "ise ne olur?

Örneğin, cls = String.class ise, String[].class almak istiyorum; cls = int.class ise, int[].class almak istiyorum, ne yapmalıyım?

Class<?> arrayCls = String[].class; 
if(arrayCls.isArray()){ 
    Class<?> cls = arrayCls.getComponentType(); 
} 

Ama ters yapmak kolay yolu bulamıyor: Görüyorsunuz

, O String[].class den String.class almak oldukça kolaydır.

Class<?> clazz = String.class; 
Class<?> arrayClass = Array.newInstance(clazz,0).getClass(); 

Lütfen bunu için herhangi vurucu yolu var mı:

Burada olası bir çözüm mü?

+1

Bu çözümdeki sorun nedir? – Thilo

+0

@Thilo Çözüm benim tahminimin bir sonucudur. İyi çalışıyor, ama bunun en iyi yol olup olmadığından emin değilim. Bu çözümün, uzunluğun 0 olduğu bir dizi varlık oluşturmak için dinamik olması gerekir. – watchzerg

+0

İlginç soru. Sadece 'Class' nesnesine neden ihtiyaç duyduğunuzu merak ediyor musunuz? –

cevap

8

Belki de Class.forName(String) deneyebilirsiniz?

Düzenleme: İşte bir kod parçacığı.

Class<?> arrayClass = String[].class; 
System.out.println(arrayClass); 
Class<?> namedClass = Class.forName("[L" + String.class.getName() + ";"); 
System.out.println(namedClass); 
System.out.println(arrayClass == namedClass); 
+1

jdk'de XMLEncoder Sınıfına göre, 'Class.forName (String)' bunu yapmak için standart yöntemdir. Tesekkurler dostum. Sınıf cls = String.class; Sınıf arrayCls = Class.forName ("[L" + cls.getName() + ";"); 'http://stackoverflow.com/questions/4581394/getting-the-class-of-an-n-dimensional -bir çalışma zamanı-sağlanan sınıf-adı – watchzerg

+0

Ah. Sonunda noktalı virgülü unuttum. – zienkikk

+2

Şahsen ben senin çözümünü 'Array.newInstance' kullanarak tercih ederim. Bu en azından belgelenmiş özellikleri kullanır. Ama isim öneki '[L' bir iç sözleşmedir. Gelecekte bunu değiştirip "XMLEncoder" sınıfını değiştirebilirler, çünkü bu da JDK'nın bir parçası. Sadece bir şey bir şekilde JDK içinde bir şey yapması gerektiği anlamına gelmez, bu sizin yapmanız gerektiği anlamına gelmez, çünkü uygulama kodunu JDK kodu yerine yazıyorsunuz. – Kidburla

11

Bulduğum başka bir hile, use yönteminde varargs kullanıyor.

public static void main(String[] args) throws ClassNotFoundException { 

    Class<?> demo = Main.<String>getArrayClass(); 
    System.out.println(demo); 
} 

static <T> Class getArrayClass(T... param){ 
    return param.getClass(); 
} 
+1

Nice trick +1 Aslında arama sitenizde 'T' belirtirseniz herhangi bir argümana gerek yoktur: 'MyClass. getArrayClass(); ' –

+0

evet iyi bahşiş :) Güncelledik! – HRgiger

+4

Çalışma zamanı türü silme nedeniyle bu neden her zaman 'Object []' sınıfını döndürmez? – SpaceTrucker

10

HRgiger cevabı geliştirilmiş:

@SuppressWarnings("unchecked") 
static <T> Class<? extends T[]> getArrayClass(Class<T> clazz) { 
    return (Class<? extends T[]>) Array.newInstance(clazz, 0).getClass(); 
} 

İkisi çağrıldığında bir dizi nesne örneğini. Dizi türünü kullanmak için

Class<?> childType = ...; 
Class<?> arrayType = getArrayClass(childType); 
+0

Bunun HRgiger’in cevabı ile ilgisi yok, bu OP’in soruda ne yazdığına dair bir gelişme. – Holger

+0

Ayrıca, her seferinde yeni bir nesneyi anında uyguladığınıza eminim. –

İlgili konular