java内省机制
Posted self-confidence,the source of
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内省机制相关的知识,希望对你有一定的参考价值。
一、概念
内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。
JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。通俗地讲,每一对set/get方法都是对应的javaBean的一个属性, 内省就是对这些属性进行操作,与反射作用相仿。
二、API方法
PropertyDescriptor类:
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
1. getPropertyType(),获得属性的Class对象;
2. getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;
3. hashCode(),获取对象的哈希值;
4. setReadMethod(Method readMethod),设置用于读取属性值的方法;
5. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。
三、举个例子
先列一个bean出来
public class ClassInfo implements Serializable { private String classId; private String className; private TeacherBean teacher; public void setName(){ } public String getClassId() { return classId; } public void setClassId(String classId) { this.classId = classId; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public TeacherBean getTeacher() { return teacher; } public void setTeacher(TeacherBean teacher) { this.teacher = teacher; } }
我们先看看上面到底有多少个属性呢?根据定义,很明显的答案就是4个,但是其实他有5个属性,看下面
BeanInfo beanInfo = Introspector.getBeanInfo(ClassInfo.class); PropertyDescriptor[] pds = info.getPropertyDescriptors(); for (PropertyDescriptor pd:pds){ System.out.println(pd.getName()); } 答案: classId className teacher name class
为什么会多了一个class属性呢,原因很简单,每个java类都继承了Object类,而Object就有一个属性class。那可不可以不让父类的属性出现呢,答案是肯定的,而且只需在取Beaninfo的时候多加一个父类的参数就可以了
BeanInfo beanInfo = Introspector.getBeanInfo(ClassInfo.class,Object.class);
这个时候获取到的属性就全部是当前类的属性了。在得到PropertyDescriptor(属性描述符)后,接下来我们就可以对其属性进行修改和获取了。
ClassInfo c = new ClassInfo(); PropertyDescriptor pd = new PropertyDescriptor("classId",ClassInfo.class); Method method = pd.getWriteMethod(); //相当于调用setClassid()方法 method.invoke(c,"233"); // //获取属性的值 Method method = pd.getReadMethod(); //相当于调用getClassid()方法 method.invoke(c,null); //第二个参数表示为null表示无参
以上是关于java内省机制的主要内容,如果未能解决你的问题,请参考以下文章