JDK 规范目录(http://www.javashuo.com/article/p-wdnembkc-ex.html)html
JavaBean 是一种特殊的 Java 类,主要用于传递数据信息,这种 Java 类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。java
一个 JavaBean 类中的方法,去掉 set 或 get 前缀,剩余部分就是属性名,若是剩余部分的第二个字母是小写的,则把剩余部分的首字母改为小的。apache
getAge/setAge --> age
gettime --> time
setTime --> timeide
若是去掉前缀,剩余部分的第二个字母为大写,则所有大写工具
getCPU --> getCPUui
Java 内省主要使用来对 JavaBean 进行操做的,因此当一个类知足了 JavaBean 的条件,就可使用内省的方式来获取和操做 JavaBean 中的字段值。内省提供了操做 JavaBean 的 API。code
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,经过这些 API 可使你不须要了解这个规则,这些 API 存放于包 java.beans 中,通常的作法是经过类 Introspector 的 getBeanInfo 方法 来获取某个对象的 BeanInfo 信息,而后经过 BeanInfo 来获取属性的描述器(PropertyDescriptor),经过这个属性描述器就能够获取某个属性对应的 getter/setter 方法,而后咱们就能够经过反射机制来调用这些方法。orm
Introspector 这个类位于 java.beans 包中,该类中的方法都是静态的,能够直接使用类名调用。htm
// 获取 beanClass 及其全部父类的 BeanInfo BeanInfo getBeanInfo(Class<?>beanClass) // 获取 beanClass 及其指定到父类 stopClass 的 BeanInfo BeanInfo getBeanInfo(Class<?> beanClass, Class<?> stopClass)
咱们可使用 Introspector 的 getBeanInfo(Class<?> beanClass) 来获取一个 JavaBean 类的 BeanInfo 对象。BeanInfo 有三个经常使用的属性:对象
// bean 信息 BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor(); // 属性信息 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); // 方法信息 MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
这个类位于 java.beans 包中。
@Test public void test() throws Exception { PropertyDescriptor pd = new PropertyDescriptor("id", User.class); System.out.println(pd.getName()); }
Spring 中使用 PropertyEditor 向 JavaBean 中注入属性。
@Test public void test1() throws Exception { User user = new User(); PropertyDescriptor propertyDescriptor = new new PropertyDescriptor("id", User.class); propertyDescriptor.setPropertyEditorClass(IntPropertyEditor.class); PropertyEditor propertyEditor = propertyDescriptor.createPropertyEditor(user); propertyEditor.setAsText("99"); Method writeMethod = propertyDescriptor.getWriteMethod(); writeMethod.invoke(user, propertyEditor.getValue()); System.out.println(user); } @Test public void test2() throws Exception { User user = new User(); PropertyDescriptor propertyDescriptor = new new PropertyDescriptor("id", User.class); propertyDescriptor.setPropertyEditorClass(IntPropertyEditor.class); PropertyEditor propertyEditor = propertyDescriptor.createPropertyEditor(user); // 这个 evt 实际上就是 propertyEditor 对象 propertyEditor.addPropertyChangeListener(evt -> { PropertyEditor source = (PropertyEditor) evt.getSource(); Method writeMethod = propertyDescriptor.getWriteMethod(); writeMethod.invoke(user, source.getValue()); }); propertyEditor.setAsText("99"); System.out.println(user); } // JDK 中的 PropertyEditor 接口 public static class IntPropertyEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { setValue(Integer.parseInt(text)); } }
Apache 组织开发了一套用于操做 JavaBean 的 API(内省)。该工具在 commons-beanutils 包中,核心类 BeanUtils:
setProperty(bean, name, value) copyProperties(target, source)
能够支持 String 到 8 中基本数据类型转换,其余引用数据类型都须要注册转换器 ConvertUtils.register(Converter, Class)
使用 BeanUtils 来格式化日期:
public static void main(String[] args) throws Exception { User user = new User(); String name = "zhangsan"; String birthday = "19801122"; // 注册一个转换器 /* 使用匿名内部类来注册转换器 ConvertUtils.register(new Converter() { public Object convert(Class beanClass, Object value) { String birthday = (String) value; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); try { return sdf.parse(birthday); } catch (ParseException e) { return null; } } }, Date.class); */ DateConverter converter = new DateConverter(); converter.setPatterns(new String[]{"yyyy-MM-dd","yyyyMMdd","MM/dd/yyyy"}); ConvertUtils.register(converter, Date.class); BeanUtils.setProperty(user, "name", name); BeanUtils.setProperty(user, "birthday", birthday); System.out.println(user); }
参考:
天天用心记录一点点。内容也许不重要,但习惯很重要!