2015-06-22 31 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(); 
    } 
} 

}

相关问题