Java反射bean属性API
是否有任何标准的方式来访问JavaBean属性,如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属性名称吗?这样,当我更改属性的值时,当我设置并获取该属性的值时,
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的答案,因为代码示例