2-java内省机制(Introspector)
Posted java基础很重要,很重要,很重要
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-java内省机制(Introspector)相关的知识,希望对你有一定的参考价值。
来一个简单的示例吧
package com.my.test; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import com.my.bean.User; public class Demo { /** * 刘诗华 * 内省机制(Introspector) * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //获取User类的字节码,不要获取直接父类(Object)的属性 BeanInfo beanInfo = Introspector.getBeanInfo(User.class,Object.class); //获取User类里面的所有属性描述器 返回数组 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor pd : pds) { //属性字段名 String name = pd.getName(); //属性字段类型 Class type = pd.getPropertyType(); System.out.println(name+"="+type); } //打印结果如下显示 //id=int //password=class java.lang.String //userName=class java.lang.String } }
获取Getter和Setter方法
package com.my.test; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import com.my.bean.User; public class Demo { /** * 刘诗华 * 内省机制(Introspector) * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //获取User类的字节码,不要获取直接父类(Object)的属性 BeanInfo beanInfo = Introspector.getBeanInfo(User.class,Object.class); //获取User类里面的所有属性描述器 返回数组 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor pd : pds) { //获取getter方法 Method readMethod = pd.getReadMethod(); //获取setter方法 Method writeMethod = pd.getWriteMethod(); System.out.println(readMethod); System.out.println(writeMethod); } //打印结果如下显示 // public int com.my.bean.User.getId() // public void com.my.bean.User.setId(int) // public java.lang.String com.my.bean.User.getPassword() // public void com.my.bean.User.setPassword(java.lang.String) // public java.lang.String com.my.bean.User.getUserName() // public void com.my.bean.User.setUserName(java.lang.String) } }
通过内省略机制封两个方法
package com.my.javabean; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.HashMap; import java.util.Map; import com.my.bean.User; public class BeanUtil { /*** * Bean对象转换成Map集合 * @param bean * @return * @throws Exception */ public static Map<String, Object> bean2map(Object bean) throws Exception { //创建一个map集合对象 Map<String, Object> map=new HashMap<String, Object>(); BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(),Object.class); //获取Bean对象的属性描述器 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); //迭代循环属性描述器 for (PropertyDescriptor pd : pds) { //获取属性名 String propertyName=pd.getName(); //获取属性值,调用 invoke方法 Object propertyValue = pd.getReadMethod().invoke(bean); //将内容存放到map集合当中 map.put(propertyName, propertyValue); } return map; } /*** * 将Map集合数据封装到Bean对象当中 * T代表数据类型 * @param beanMap 参数Map * @param beanType Bean对象字节码 * @return * @throws Exception */ public static <T>T map2bean(Map<String, Object> beanMap,Class<T> beanType) throws Exception { //创建Bean对象,用T类型来接收 T是在Class<T> beanType这个参数就会确认实际类型 T obj = beanType.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(beanType,Object.class); //获取Bean对象的属性描述器 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor pd : pds) { //获取属性名 String propertyName=pd.getName(); //从Map集合中取出数据,封装到Bean对象当中 pd.getWriteMethod().invoke(obj, beanMap.get(propertyName)); } return obj; } public static void main(String[] args) throws Exception { User u=new User(100,"刘诗华","xxx"); Map<String, Object> m = BeanUtil.bean2map(u); System.out.println(m); //{id=100, userName=刘诗华, password=xxx} User user = map2bean(m,User.class); System.out.println(user); //User(id=100, userName=刘诗华, password=xxx) } }
以上是关于2-java内省机制(Introspector)的主要内容,如果未能解决你的问题,请参考以下文章