2015-06-22 29 views
2

我正在使用反射來讀取類的屬性及其值。有字符串,布爾類型和類屬性。如何獲取類類型的值。反射 - 讀取類的屬性而不是字符串或int

User.java

private String firstName; 
private String lastName; 
private SupportLangauge flang; 
private SupportLangauge mlang; 

SupportLanguage.java

private String languageCode; 
private Boolean flang; 
private Boolean mlang; 

我能救法蘭面的數據,使用反射mlang,但無法讀取值。當我閱讀時,對象正在返回。見下面的示例。

結果:

 "flang": "[email protected] 
      [\r\n  languageCode=EN_US\r\n]", 
     "mlang": "[email protected] 
      [\r\n languageCode=EN_US\r\n]", 

我下面的代碼保存的語言類型。

SavingUser.java

for (User user : CollectionsUtilService.nullGuard(userList)) { 
PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(
    user.getClass()).getPropertyDescriptors(); 
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { 
if (fieldValueMap.containsKey(propertyDescriptor.getName())) { 
if (propertyDescriptor.getPropertyType().getName(). 
equalsIgnoreCase("com.sample.entity.user.SupportLanguage")) { 
        String langString = fieldValueMap. 
      get(propertyDescriptor.getName()); 
      SupportLanguage s = new SupportLanguage(); 
        s.setLanguageCode(langString); 
        propertyDescriptor.getWriteMethod().invoke(user, s); 
       }     

      } 
     } 
    } 

我對閱讀的價值準則;

RenderingUser.java

   if (propertyDescriptor.getPropertyType(). 
       getName().equalsIgnoreCase 
       ("com.sample.entity. 
        user.SupportLanguage")) { 
        Method m = propertyDescriptor.getReadMethod(); 
        SupportLanguage s = new SupportLanguage(); 
        System.out.println("m.invoke(SupportLanguage) " 
        + m.invoke(s)); 
+0

你得到的輸出'com.sample.entity.user.SupportLanguage @ 3080037d'因爲類'SupportLanguage'不會覆蓋'的toString()'方法;請參閱[如何在不獲取「SomeType @ 2f92e0f4」的情況下打印我的Java對象?](http://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4 ) – Jesper

回答

0

您的閱讀幾乎是正確的。但是您必須使用根對象(User)而不是屬性對象。

User user = ...; // Initialized user object 
      if (propertyDescriptor.getPropertyType(). 
      getName().equalsIgnoreCase 
      ("com.sample.entity. 
       user.SupportLanguage")) { 
       Method m = propertyDescriptor.getReadMethod(); 
       SupportLanguage s = m.invoke(user); 
       System.out.println("languageCode: " + s.getLanguageCode()); 
0

,而不是使用Java bean API也可以使用如下例所示的純反射。問題的關鍵是如果虛擬機在一個安全的環境上運行,那麼可以導致可訪問性異常的私有字段被訪問。但是對於這種情況你可能會讓你的財產受到保護。

public class GetPropertyTest { 

@Test 
public void testGetFLang() throws Exception { 
    User user = new User(); 

    Field declaredField = user.getClass().getDeclaredField("flang"); 
    declaredField.setAccessible(true); 

    // get the value 
    SupportLanguage flang = (SupportLanguage) declaredField.get(user); 

    assertEquals( 
     "SupportLanguage [languageCode=lang1, flang=true, mlang=true]", 
     flang.toString() 
    ); 

    // set new value 
    declaredField.set(user, new SupportLanguage("lang3", false, false)); 
    assertEquals(
     "User [firstName=null, lastName=null, " 
     + "flang=SupportLanguage [languageCode=lang3, flang=false, mlang=false], " 
     + "mlang=SupportLanguage [languageCode=lang2, flang=true, mlang=true]]", 
     user.toString() 
    ); 
} 

@Test 
public void testSetValuesFromMap() throws Exception { 
    Map<String, Object> valueMap = new HashMap<String, Object>(); 
    valueMap.put("firstName", "Jon"); 
    valueMap.put("lastName", "Doo"); 
    valueMap.put("flang", new SupportLanguage("langFormMap1", true, true)); 
    valueMap.put("mlang", new SupportLanguage("langFormMap2", true, true)); 

    User user = new User(); 

    for (Map.Entry<String, Object> entry : valueMap.entrySet()) { 
     String fieldName = entry.getKey(); 
     Object fieldValue = entry.getValue(); 
     Field declaredField = user.getClass().getDeclaredField(fieldName); 
     declaredField.setAccessible(true); 
     declaredField.set(user, fieldValue); 
    } 

    assertEquals(
     "User [" 
     + "firstName=Jon, " 
     + "lastName=Doo, " 
     + "flang=SupportLanguage [languageCode=langFormMap1, flang=true, mlang=true], " 
     + "mlang=SupportLanguage [languageCode=langFormMap2, flang=true, mlang=true]]", 
     user.toString() 
    ); 
} 

public class User { 
    private String firstName; 
    private String lastName; 
    private SupportLanguage flang = new SupportLanguage("lang1", true, true); 
    private SupportLanguage mlang = new SupportLanguage("lang2", true, true); 
    @Override 
    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     builder.append("User [firstName="); 
     builder.append(firstName); 
     builder.append(", lastName="); 
     builder.append(lastName); 
     builder.append(", flang="); 
     builder.append(flang); 
     builder.append(", mlang="); 
     builder.append(mlang); 
     builder.append("]"); 
     return builder.toString(); 
    } 

} 

public class SupportLanguage { 

    private String languageCode; 
    private Boolean flang; 
    private Boolean mlang; 


    public SupportLanguage(String languageCode, Boolean flang, Boolean mlang) { 
     super(); 
     this.languageCode = languageCode; 
     this.flang = flang; 
     this.mlang = mlang; 
    } 

    @Override 
    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     builder.append("SupportLanguage [languageCode="); 
     builder.append(languageCode); 
     builder.append(", flang="); 
     builder.append(flang); 
     builder.append(", mlang="); 
     builder.append(mlang); 
     builder.append("]"); 
     return builder.toString(); 
    } 
} 

}

相關問題