JavaBean只是一种符合特定规则的普通类,他类中的方法主要用于访问私有字段,且方法名符合某种命名规则。
规则就是去掉get与set前缀后,剩余部分就是属性名,如果剩余部分的第二的字母是小写的,则把剩余部分的首字母改成小的。
比如有一个Person类:
<p>public class Person {</p><p> private int age;
private String name;
public String getName() {
return name;
}</p><p> public void setName(String name) {
this.name = name;
}</p><p> public int getAge() {
return age;
}</p><p> public void setAge(int age) {
this.age = age;
}
}</p>
JavaBean主要是用于我们只知道一个类的Bean方法,根据这种规则我们就可以知道类中私有的属性名。
普通的类如果有set与get方法,也可以当做JavaBean类使用。
内省Introspector是操作JavaBean类的一种工具类。
他的一个静态方法可以对JavaBean进行内省。
static BeanInfo | getBeanInfo(Class<?> beanClass) 在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。 |
比如我们想获得并设置Person类的私有字段:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class hardDemo {
public static void main(String[] args) throws Exception
{
Person person = new Person();
BeanInfo bean = Introspector.getBeanInfo(Person.class);
//获得Person类中所有字段的属性描述集
PropertyDescriptor[] p = bean.getPropertyDescriptors();
//遍历这个数组,通过get,set方法的命名方式获得字段名
for(PropertyDescriptor p1 : p)
{
//获得字段的属性
// System.out.println( p1.getPropertyType());
//获得字段的名称
// System.out.println(p1.getName());
//获得name字段的只读方法
Method m1 = p1.getReadMethod();
System.out.println(m1.getName());
//获得name字段的只写方法
Method m2 = p1.getWriteMethod();
//设置name值
if(p1.getName().equals("name"))
{
Method m = p1.getWriteMethod();
m.invoke(person,"wang");
}
}
System.out.println( person.getName());;
}
}
当然如果我们知道他的一个方法叫做getName可以直接获得特定的方法了,不必再使用BeanInfo了,直接使用PropertyDescriptor获得特定字段的属性描述。
下面是所使用的构造方法:PropertyDescriptor(String propertyName, Class<?> beanClass)
通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Person p = new Person();
PropertyDescriptor pd = new PropertyDescriptor("age",p.getClass());
pd.getWriteMethod().invoke(p, 30);
System.out.println(pd.getReadMethod().invoke(p));