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)
    }
}

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

时间: 2024-10-27 12:19:18

2-java内省机制(Introspector)的相关文章

java内省机制Introspector

访问JavaBean属性的两种方式 1)直接调用bean的setXXX或getXXX方法: 2)通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式: a)通过PropertyDescriptor类操作Bean的属性: b)通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,

Java 内省机制

一.内省 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法.JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”,方法比较少,这些信息储存在类的私有变量中,通过set().get()获得,如下所示: 1 public class Student { 2

java内省机制

一.概念 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”.方法比较少.这些信息储存在类的私有变量中,通过set().get()获得.通俗地讲,每一对set/get方法都是对应的javaBean的一

【Java笔记】Java——远程监控、反射、代理、内省机制

远程控制的基本原理 远程控制(RemoteControl)拥有控制端和被控端双方. 控制方通过请求,取得对远端的操作,实现远端的事件回放功能,同时,应该看得到远端桌面的画面.而被控方必须在建立ServerSocket之后进行对外来请求的鉴听. 1 /** 2 * 客户端发送事件 3 * @param e 4 */ 5 public void sendEvent(InputEvent e){ 6 try { 7 SinglClient.getInstance().getOos().writeObj

Java读书笔记十一(Java中的内省机制)

1.前言 最近在学习Java的时候,突然发现了这个概念,鉴于好奇心的压迫,于是打算写一篇博客来总结一下. 2.什么是内省机制 为了让程序员们更好的从左Java对象的属性,SUN公司开发了一套API,就被我们称为"内省",有利于我们对类对象的属性的操作,减少了代码的数量. 3.内省和反射有什么区别 反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态. 内省机制是通过反射来实现的,BeanInfo用来暴露一个b

Java反射及 IoC原理、内省机制

JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性. 1.2 反射机制的作用 在运行时判断任

Java 内省 Introspector

操纵类的属性,有两种方法 反射 内省 面向对象的编程中,对于用户提交过来的数据,要封装成一个javaBean,也就是对象 其中Bean的属性不是由字段来决定的,而是由get和Set方法来决定的 public class Person { private String name ; private String password; private int age; public String getName() { return name; } public void setName(String

Java内省

大家都知道,Java给我提供了反射机制,使我们可以获取到每一个类的每一个属性和方法,并对此进行操作.但是利用反射来操作对象时过于麻烦,所以sun公司就基于反射机制给大家提供了一个更加简单实用的api,那就是内省(Introspector),而内省这套api将会使我们操作JavaBean的属性更加方便. 1.什么是Javabean? ①类必须是公共的 ②类必须具备无参构造器 2.什么是Javabean的属性? 要理解内省的概念,我们先来理解一下什么叫Javabean的属性,下面我们猜下该Javab

Java内省详解

内省和反射有什么区别: 反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态.  内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性.方法和事件,以后我们就可以操纵该JavaBean的属性. 1.通过PropertyDescriptor修改属性方式 1 public class BeanInfoUtil { 2 public static void setProperty(UserInfo user