2011-05-02 57 views
22

是否有访问Java Bean属性像Java反射豆物业API

class A { 
    private String name; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 

} 

任何标准的方式,使我可以访问使用反射API的java bean属性的名称,这样当我改变的属性值的方法当我设置和获取财产

回答

40

你需要什么的BeanInfo /内部检查机制(见Bozho的答案)。但是,直接使用它是很麻烦的,所以你可以使用其中一个提供基于属性访问的库。最有名的大概是Apache Commons/BeanUtils(另一个是Spring的BeanWrapper抽象)

示例代码:

A someBean = new A(); 

// access properties as Map 
Map<String, Object> properties = BeanUtils.describe(someBean); 
properties.set("name","Fred"); 
BeanUtils.populate(someBean, properties); 

// access individual properties 
String oldname = BeanUtils.getProperty(someBean,"name"); 
BeanUtils.setProperty(someBean,"name","Barny"); 
+0

只为无知(我),为什么不只是调用someBean.setName(“弗雷德”)? – simpatico 2011-05-02 12:44:32

+1

@simpatico对于一个已知的财产,显然,是的。但是如果你想管理对许多不同类型对象的许多不同属性的访问,请使用bean属性 – 2011-05-02 12:48:11

+1

谢谢。我购买它,如果属性设置在一个文件加载,然后只调用BeanUtils.populate(someBean,属性); 但我从来没有在实践中调用set(“name”,“Fred”),而我可以直接调用setName(“Fred”)(我没有你的只是示例代码)。 – simpatico 2011-05-02 13:30:27

37

你的问题是非常不清楚的值的getName和setName被自动调用,但如果我得到它:

是。 java.beans包装有所谓的Introspector。在那里你可以阅读一个bean的属性。

BeanInfo info = Introspector.getBeanInfo(Bean.class); 
PropertyDescriptor[] pds = info.getPropertyDescriptors(); 

您可以按名称查找所需PropertyDescriptor,你可以调用getReadMethod().invoke(..)

+9

我更喜欢这种方法,因为你不需要依赖。 – 2012-10-15 14:41:50

1

我已经试过的BeanUtils还有的PropertyDescriptor是因为我没有在类的信息被传递给我的方法。我甚至不知道传递的属性的数据类型,因此设置值变得困难。我知道BeanUtils应该为属性自动进行转换并进行设置,但它并没有为我保存数据。所以最后,我不得不依靠获得领域。这是我做的:

Field[] fields = className.getDeclaredFields(); 
for (int i=0; i<fields.length ;i++) 
{ 
    String element = fields[i].getName(); 
    String propertyType = fields[i].getType().getName(); 
    fields[i].setAccessible(true); 
    if(propertyType.equalsIgnoreCase("java.lang.Integer")) 
    { 
     fields[i].set(mypojoObj, Integer.parseInt(parameterValue)); 
    } 
    else 
    { 
     fields[i].set(mypojoObj, parameterValue); 
    } 
} 

我做了一个类似的开关大小写转换所有属性类型为正确的类型。当从页面中获取时,request.getParameter(paramname)总是返回String,所以这个转换对我有用。直接数据转换的任何更好的选择将非常有帮助。