Java内省和反射浅谈
一、什么是内省?
内省(Introspector)是Java语言对JavaBean类属性、事件的处理方法
例如类User中有属性name,那么必定有getName,setName方法,我们可以通过他们来获取或者设置值,这是常规操作。
Java提供了一套API来访问某个属性的getter/setter方法,这些API存放在java.beans中
二、什么是反射?
Java反射机制是在运行中,对任意一个类,能够获取得到这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取类信息以及动态调用类对象方法的功能叫做Java语言的反射机制
三、示例解析
存在类User:
public class User { private String name; private int age; private Date birthday; public String getName() { return name; } public void setName(String name) { System.out.println("[User:setName "+name+"]"); this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", birthday=" + birthday + "]"; } }
通过反射机制操作name属性:
User user = new User(); Field f = user.getClass().getDeclaredField("name"); f.setAccessible(true); f.set(user, "mld");//设置属性值 String name = (String)f.get(user);//获取属性值
通过内省操作name属性:
User user = new User(); //操作单个属性 PropertyDescriptor pd = new PropertyDescriptor("name", User.class); Method w = pd.getWriteMethod();//获取属性的setter方法 w.invoke(user, "winclpt"); Method r = pd.getReadMethod();//获取属性的getter方法 r.invoke(user, null); //操作所有属性 BeanInfo bi = Introspector.getBeanInfo(User.class); PropertyDescriptor[] pds = bi.getPropertyDescriptors(); for(PropertyDescriptor p : pds){ }
四、区别
反射可以操作各种类的属性,而内省只是通过反射来操作JavaBean的属性
内省设置属性值肯定会调用seter方法,反射可以不用
PS:有毛用???我直接用反射不好了,谁给我解释下