一、软件包 java.beans
包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件
二、PropertyDescriptor
PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性
public class PropertyDescriptor extends FeatureDescriptor { //构造方法 //通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor public PropertyDescriptor(String propertyName, Class<?> beanClass) throws IntrospectionException{} //获得属性的 Class 对象 public Class<?> getPropertyType(){} //获得应该用于读取属性值的方法 public Method getReadMethod(){} //获得应该用于写入属性值的方法 public Method getWriteMethod(){} }
三、示例
import java.beans.PropertyDescriptor; import java.lang.reflect.Method; public class IntrospectorDemo { public static void main(String[] args)throws Exception { Person p = new Person("李四",20); String propertyName = "name"; Object obj = getProperty(p,propertyName); System.out.println(obj); Object value = "王武"; setProperty(p, propertyName, value); System.out.println(p.getName()); } private static void setProperty(Object obj,String propertyName,Object value)throws Exception { PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass()); Method setMethod = pd.getWriteMethod(); setMethod.invoke(obj, value); } private static Object getProperty(Object obj,String propertyName) throws Exception { PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass()); Method getMethod = pd.getReadMethod(); return getMethod.invoke(obj); } } class Person { private String name; private int age; Person(String name,int age) { 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; } }
四、JavaBean的复杂内省操作
- 采用便利BeanInfo的所有属性方式来查找和设置某个Person的name属性
- 在程序中把一个类当作JavaBean来看
- 就是调用Introspector.getBeanInfo方法
- 得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息
/** * Introspector * Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法 * 对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式或隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。 * 如果某个类提供有关其自身的显式 BeanInfo, * 则将它添加到从分析所有派生类得到的 BeanInfo 信息中,并将显式信息视为当前类及其基类的确定的信息,无需进一步深入超类链进行分析。 * 如果没有在某个类上发现显式 BeanInfo, * 则使用低层次的反射来研究类的方法,并应用标准设计模式来标识属性存储器、事件源或公共方法。 * 然后深入分析类的超类,从它那里(可能在超类链的顶部)添加信息。 */ public class Introspector { //没有构造方法,其余方法均为静态的 //在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件 public static BeanInfo getBeanInfo(Class<?> beanClass) throws IntrospectionException{} }
/** * BeanInfo * 希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类, * 该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。 */ public interface BeanInfo { //获得 beans PropertyDescriptor PropertyDescriptor[] getPropertyDescriptors(); //获得 beans MethodDescriptor MethodDescriptor[] getMethodDescriptors(); }
//上述示例,用复杂的内省操作,代码如下 private static Object getProperty(Object obj,String propertyName) throws Exception { BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal = null; for(PropertyDescriptor pd : pds) { if(pd.getName().equals(propertyName)) retVal = pd.getReadMethod().invoke(obj); } return retVal; }
相关推荐
openbean.jar包, AndroidStudio 使用java.beans.*,需要导入这个jar包哦
Java反射中java.beans包学习总结.docx
需要使用到java.beans.BeanInfo 等类,但是AS默认是没有这些类的,导致项目不能编译。使用openBeans.jar 方案能解决此问题。import 的包需要改一下。改成import com.googlecode.openbeans.BeanInfo。 解决
android 使用java.beans.*
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--java.beans
Java Beans精简版 轻巧,快速的java.beans.Introspector重新实现,用于消除对Bean Introspection...重新实现了java.beans.Introspector类,以非常轻巧和超快速的方式(仅将分析结果自动缓存)进行java Bean的分析,并且
本篇文章通过学习Java反射中java.beans包,吧知识点做了总结,并把相关内容做了关联,对此有需要的朋友可以学习参考下。
org.springframework.beans-3.0.5工程所需jar包,com.springsource.net.sf.cglib-2.2.0.jar、 com.springsource.org.apache.commons.logging-1.1.1.jar、 javax.inject.jar、 javax.servlet.jsp.jar、 org.spring...
JAVA API官方文档中文版软件包 java.applet java.awt java.awt.color ...java.beans.beancontext java.io java.lang java.lang.annotation java.lang.instrument java.lang.management java.lang.ref
org.springframework.beans-sources-3.0.5.release.jar
org.springframework.beans-3.0.0.M4.jar
由于它与AWT和Swing紧密依赖,因此无法轻易将其从java.desktop模块中删除,从而导致任何使用java.beans包的第三方库都依赖于所有java.desktop类。 java.desktop模块的额外开销使JVM安装增加了12mb的大小,并增加了...
org.springframework.beans-3.1.0.M2
org.springframework.beans-3.1.0.RELEASE.jar
org.springframework.beans-2.5.5.A.jar, org.springframework.beans-2.5.6.A.jar, org.springframework.beans-2.5.6.SEC01.jar, org.springframework.beans-3.0.0.M1.jar, ...org.springframework.beans.jar
org.springframework.beans-3.0.0.CI-331.jar的jar包下载,请安心使用。
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) ... 38 more Caused by: java.lang.ClassNotFoundException: ...
中文版,平时开发超...java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 ......
【项目源码】-java进销存管理系统 ... ...import java.beans.PropertyVetoException; import java.lang.reflect.Constructor; import java.net.URL; import java.util.HashMap; import java.util.Map;
NULL 博文链接:https://chyy001.iteye.com/blog/1338488