Java反射之对JavaBean的内省操作

Wesley13
• 阅读 468

上一篇我们说了Java反射之数组的反射应用 这篇我们来模拟实现那些javabean的框架(BeanUtils)的基本操作。

[一] 什么是JavaBean

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,通过set和get方法获取。 一般我们根据这种方法命名规则,通过反射获得某个或者设置某个属性的时候,假如这个属性名为”x",那么,就会处理以下几步: 1、将x变为大写X,判断x后是否还有字母,有则首字母大写 2、在x前加get

[二] 对JavaBean的复杂内省操作

这是一种比较笨重的方式: Bean类:

package club.leyvan.muzile;

public class Bean {
    private int x = 10;
    private int y = 20;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    
}

测试类:

    public static void main(String[] args) throws Exception {
        Bean bean = new Bean();
        System.out.println(getProperty(bean, "x"));
        setProperty(bean, "y", 8);
        System.out.println(getProperty(bean,"y"));
    }
    
    /**
     * 根据属性名获得属性方法
     * @param obj
     * @param propertyName
     * @return
     * @throws Exception
     */
    public static Object getProperty(Object obj,String propertyName) throws Exception{
        Object retVal = null;
        //通过内省获得描述对象
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        //通过描述对象获得该类的所有属性描述
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        //迭代所有属性,获得与规则相同的方法。
        for(PropertyDescriptor pd : pds){
            //如果该属性的名称与方法形参一致
            if(pd.getName().equals(propertyName)){
                //则调用该属性的get方法
                Method method = pd.getReadMethod();
                //get方法都是无参数的
                retVal = method.invoke(obj);
            }
        }
        
        return retVal;
    }
    
    /**
     * 根据属性名设置属性的方法
     * @param obj
     * @param propertyName
     * @param value
     * @throws Exception
     */
    public static void setProperty(Object  obj,String propertyName,Object value) throws Exception{
        //通过内省获得描述对象
                BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                //通过描述对象获得该类的所有属性描述
                PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
                //迭代所有属性,获得与规则相同的方法。
                for(PropertyDescriptor pd : pds){
                    //如果该属性的名称与方法形参一致
                    if(pd.getName().equals(propertyName)){
                        //则调用该属性的set方法
                        Method method = pd.getWriteMethod();
                        //set方法传入参数
                        method.invoke(obj,value);
                    }
                }
    }

结果:

10
8

将原本等于20的y改为了8

[三] 对JavaBean的简单内省操作

上面是一种笨拙的方式,有更为简单的方法:

    public static void main(String[] args) throws Exception {
        Bean bean = new Bean();
        System.out.println(getProperty(bean, "x"));
        setProperty(bean, "y", 39);
        System.out.println(getProperty(bean,"y"));
    }
    
    public static Object getProperty(Object obj,String propertyName) throws Exception{
        Object retVal = null;
        //直接获得属性描述对象
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass());
        //根据属性,获得get方法
        Method method = pd.getReadMethod();
        //调用方法
        retVal = method.invoke(obj);
        return retVal;
    }
    
    public static void setProperty(Object  obj,String propertyName,Object value) throws Exception{
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass());
        Method method = pd.getWriteMethod();
        method.invoke(obj, value);
    }

结果:

10
39

本期Java反射就介绍到这,谢谢大家!

点赞
收藏
评论区
推荐文章
御弟哥哥 御弟哥哥
3年前
Java基础与提高干货系列 -- Java反射机制
前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文Java反射机制定义Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
Wesley13 Wesley13
2年前
java反射详解
来源:Java基础之—反射(非常重要)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fsinat_38259539%2Farticle%2Fdetails%2F71799078)反射是框架设计的灵魂使用的前提条件:必
Wesley13 Wesley13
2年前
Java面试备战篇——多线程&并发篇(一)
上一篇:Java面试备战篇——JVM篇(二)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fweixin_49895216%2Farticle%2Fdetails%2F107885244)
Wesley13 Wesley13
2年前
C#中的反射解析及使用(转)
原文:https://cloud.tencent.com/developer/article/1129356(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fcloud.tencent.com%2Fdeveloper%2Farticle%2F1129356)1、对C反射机制的理解2
Wesley13 Wesley13
2年前
Java面试备战篇——Spring篇
上一篇:Java面试备战篇——多线程&并发篇(二)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fweixin_49895216%2Farticle%2Fdetails%2F107886020)
Wesley13 Wesley13
2年前
Java反射技术概述
1.什么是Java反射?  就是正在运行,动态获取这个类的所有信息2.反射机制的作用  a.反编译:.class.java  b.通过反射机制,访问Java对象的属性,方法,构造方法等3.反射机制的应用场景  Jdbc加载驱动  SpringIOC实现  Java框架4.创建对象的两种方式  a.直
Wesley13 Wesley13
2年前
Java基础之内省
Java基础之内省什么是内省  首先,我们要知道什么是内省。按我自己的理解就是在反射的原理上进行封装,来更方便的操作JavaBeanJavaBean就是特殊格式的类,其规范为:1.JavaBean类必须是一个公共类,即使用关键字public声明类。2.JavaBean类中必须有
Wesley13 Wesley13
2年前
Java反射是什么?看这篇绝对会了!
作者:火星十一郎https://www.cnblogs.com/hxsyl(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fhxsyl)一.概念反射就是把Java的各种成分映射成相应的Java类。Class(https://www
Wesley13 Wesley13
2年前
Java反射异常:java.lang.NoSuchFieldException
Java反射异常:java.lang.NoSuchFieldException参考文章:(1)Java反射异常:java.lang.NoSuchFieldException(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblog%2F
Wesley13 Wesley13
2年前
Java反射例子汇总 Class Constructor Method Filed
一、反射概述  在平常的开发中Java的反射技术很少被用到,一般我们都是使用公司封装或者开源框架。而反射技术已经被包含到底层框架了,因此我们很少接触到。但是有些框架的原理或者源码如果想读懂就必须要理解并会使用反射技术。例如:EventBus、BufferKnife、android的插件化等等都会用到。理解了反射技术能够帮助我们更快的理解相关框架,也可以增