内省调用JavaBean实现getXxx和setXxx的两种方式

来源:互联网 发布:新星星知我心 编辑:程序博客网 时间:2024/06/10 08:58



一.JavaBean类:Java语言欠缺属性、事件、多重继承功能。所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码。Java Bean正是编写这套胶水代码的惯用模式avaBean:J或约定。这些约定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵守上述约定的类可以用于若干工具或库。

二.内省:内省是Java语言对Bean类属性、事件的一种处理方法。例如类Student中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。

两种方法去获取属性对应的getter/setter方法:

 

1.通过直接创建PropertyDescriptor类带参构造方法来获取getter/setter

 

<span style="font-size:14px;">import java.beans.PropertyDescriptor;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class JavaBeanPerson { public static void main(String[] args) throws Exception {// TODO Auto-generated method stub //获取person类Class clazz = Class.forName("Person");Constructor c = clazz.getConstructor(String.class,int.class);Object person = c.newInstance("CDSN",18);//利用PropertyDescriptor类带参构造的对象PropertyDescriptor pd = new PropertyDescriptor("name", clazz);Method getName = pd.getReadMethod();Method setName = pd.getWriteMethod();Object name =  getName.invoke(person, null);System.out.println("Person's name:"+name);setName.invoke(person, "CDSN18");String name1 = (String) getName.invoke(person, null);System.out.println("Person's name1:"+name1);}}  //JavaBean类class Person{private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}</span>


 

2.通过PropertyDescriptor数组遍历获取getter/setter。

 

<span style="font-size:14px;">import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class JavaBeanPerson { public static void main(String[] args) throws Exception {// TODO Auto-generated method stubClass clazz = Class.forName("Person");Constructor c = clazz.getConstructor(String.class,int.class);Object person = c.newInstance("CDSN",18);String age = "age";//获取PropertyDescriptor数组BeanInfo bi = Introspector.getBeanInfo(clazz);PropertyDescriptor[] pds = bi.getPropertyDescriptors();PropertyDescriptor pd = new PropertyDescriptor("age", clazz);Method getAge = pd.getReadMethod();Object ageNum =  getAge.invoke(person, null);System.out.println("Person's age:"+ageNum);//利用PropertyDescriptor数组遍历出所求的属性for(PropertyDescriptor pd1 :pds){if(age.equals(pd.getName())){pd1.getWriteMethod().invoke(person,88);Object ageNum1 =pd1.getReadMethod().invoke(person, null);System.out.println("Person's age1:"+ageNum1);break;}}}}  //JavaBean类class Person{private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}</span>


 

 

 

0 0
原创粉丝点击