码迷,mamicode.com
首页 > 编程语言 > 详细

2-java内省机制(Introspector)

时间:2018-10-11 23:50:17      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:shm   use   dem   getpass   script   int   ref   cto   数据类型   

来一个简单的示例吧

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)

标签:shm   use   dem   getpass   script   int   ref   cto   数据类型   

原文地址:https://www.cnblogs.com/hua900822/p/9775442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!