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)的主要内容,如果未能解决你的问题,请参考以下文章

内省(introspector)------>JavaBean

内省(Introspector)

内省(Introspector)

内省Introspector(反射操作javaBean)

深入理解Java:内省(Introspector)

java内省Introspector