Java反射bean属性API

Java反射bean属性API,java,reflection,javabeans,Java,Reflection,Javabeans,是否有任何标准的方式来访问JavaBean属性,如 class A { private String name; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } } 因此,我可以使用反射API访问这个java bean属性名称吗?这样,当我更改属性的值时,当我设置并获取该属性的值时,

是否有任何标准的方式来访问JavaBean属性,如

class A {
   private String name;

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

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

}

因此,我可以使用反射API访问这个java bean属性名称吗?这样,当我更改属性的值时,当我设置并获取该属性的值时,会自动调用getName和setName的方法。您的问题很不清楚,但如果我得到了它:

对。
java.beans
包具有所谓的。在那里,您可以读取bean的属性

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

您可以通过名称找到所需的
PropertyDescriptor
,并且可以调用
getReadMethod()。调用(…)

您需要的是BeanInfo/Introspector机制(请参见Bozho的答案)。但是,直接使用它是非常困难的,因此您可以使用提供基于属性访问的库之一。最著名的可能是(另一个是Spring的抽象)

示例代码:

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"); 
A someBean=newa();
//作为映射访问属性
映射属性=BeanUtils.description(someBean);
属性集(“名称”、“Fred”);
填充(someBean、属性);
//访问单个属性
字符串oldname=BeanUtils.getProperty(someBean,“name”);
setProperty(someBean,“name”,“Barny”);

我尝试了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);
    }
 }
Field[]fields=className.getDeclaredFields();

对于(inti=0;i使用
java.beans.PropertyDescriptor

就你而言:

A a = new A();
PropertyDescriptor nameProperty = new PropertyDescriptor("name", A.class);
nameProperty.getWriteMethod().invoke(a, "potato");
System.out.println(nameProperty.getReadMethod().invoke(a));

对于无知的人(我),为什么不为一个已知的属性调用someBean.setName(“Fred”)?@simpatico,显然是的。但是如果你想管理对许多不同类型对象的许多不同属性的访问,请使用bean属性谢谢。如果这些属性设置在一个加载的文件中,然后只调用BeanUtils.populate,我会买它(someBean,properties);但实际上我从来没有调用过set(“name”,“Fred”),而我可以直接调用setName(“Fred”)(我不知道你的代码只是示例代码)@simpatico:如果你在编译时知道有一个
setName
方法,那就是你应该使用的方法。否则,bean内省器会让你的生活更轻松,因为它可以减少很多耦合。此外,使用内省的成本实际上并不太高(在关键的内部循环之外)。我更喜欢这种方法,因为您不需要依赖项。这种方法的另一个优点是可以重用java.lang.reflect.method,以便在同一类的不同实例上获取/写入同一属性的值可以快得多,读取属性比使用BeanUtils和20倍Spring BeanRapper快100倍左右我也喜欢perdi estaquel的答案,因为代码示例