2013-07-04 20 views
16

Ben bir yöntemi vardır:Yansıma aracılığıyla bir Java alanından dize değeri nasıl alınır?

public void extractStringFromField(Class<?> classToInspect) { 
    Field[] allFields = classToInspect.getDeclaredFields(); 

    for(Field field : allFields) { 
     if(field.getType().isAssignableFrom(String.class)) { 
      System.out.println("Field name: " + field.getName()); 

      // How to get the actual value of the string?!?! 
      // String strValue = ??? 
     } 
    } 
} 

bu ben gibi çıktı almak çalıştırır: Şimdi kullanarak yansıma strValue, içine gerçek dize değeri ayıklamak nasıl

Field name: java.lang.String 

?

+0

Olması Gerekmiyor mu? System.out.println ("Alan adı:" + field.getName()); –

+0

Evet - kesilmiş n 'yapıştırması hatası! –

+1

Hangi alanın değerini almak istersiniz? Hangi nesne üzerinde? –

cevap

24

Sınıfın bir örneğine başvuru yapmanız gerekiyor gibi görünüyor. get numaralı telefonu aramak ve başvuruyu bir String'e döndürmek için başvuruda bulunmak istersiniz.

aşağıdaki şekilde elde kullanabilirsiniz: İdeal durumlarda

String strValue = (String) field.get (objectReference); 
+0

Alan statik olsa bile, bir başvuruyu iletmeniz gereken API'nın talihsiz bir yönüdür. – Owen

+9

'null' iletebilirsiniz. –

+0

Harika, güzel nokta. Java'dan çok uzun zaman harcadım. – Owen

5

, Class verileri tutmaz. Sadece kendi örneklerinin yapısı ve davranışları ile ilgili bilgileri tutar ve Classes Örneklerini kullanmak için verilerinizi tutun. Yani, extractStringFromField yönteminiz, herhangi bir örneği (değerleri fiilen çıkaracağı yere) aktarmadığınız sürece değerleri ayıklayamaz. yansıma alanları için

String strValue = (String)field.get(instance); 
1

Sadece yararlı bir örnek kod:

referans parametrenin adı, değer ayıklamak için geçiyoruz

sonra kolayca feryat gibi istediğini elde edebilirsiniz, instance olduğunu

Field[] fields = InsanceName.getDeclaredFields(); 
for (Field field : fields) {  //array for fields names 

System.out.println("Fields: " + Modifier.toString(field.getModifiers())); // modyfiers 
System.out.println("Fields: " + field.getType().getName()); //type var name 
System.out.println("Fields: " + field.getName());  //real var name 
field.setAccessible(true);        //var readable 
System.out.println("Fields: " + field.get(InsanceName)); //get var values 
System.out.println("Fields: " + field.toString());  //get "String" values 
System.out.println(""); //some space for readable code 
} 
İlgili konular