iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >有关Java中的BeanInfo介绍
  • 321
分享到

有关Java中的BeanInfo介绍

2024-04-02 19:04:59 321人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1、JavaBean介绍2、JavaBean的自省3、JavaBean内省工具Introspector4、JavaBean内省结果BeanInfo5、内省结果BeanInfo的类

1、JavaBean介绍

维基百科JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。要成为JavaBean类,则必需遵循关于命名、构造器、方法的特定规范。有了这些规范,才能有可以使用、复用、替代和连接JavaBeans的工具。规范如下:

  • 有一个public的无参数构造器。
  • 属性可以通过getsetis(可以替代get,用在布尔型属性上)方法或遵循特定命名规范的其他方法访问。
  • 可序列化。

以下为一个合法的JavaBean的定义:


public class PersonBean implements java.io.Serializable {

    
    private String name = null;

    private boolean deceased = false;

    
    public PersonBean() {
    }

    
    public String getName() {
        return name;
    }

    
    public void setName(final String value) {
        name = value;
    }

    
    public boolean isDeceased() {
        return deceased;
    }

    
    public void setDeceased(final boolean value) {
        deceased = value;
    }
}

2、JavaBean的自省

用一个简单的springMVC用户登录的场景来描述一下JavaBean的自省,用户登录时候,前端表单传递的参数通常是一个如下Json字符串:


{
 "username":"xxx",
 "passWord":"xxxx"
}


后端接受表单的地方,通常可以使用一个JavaBeanRequestBody的形式接收参数:


public void login(@RequestBody LoginRequest request){
     // Do login
}


其中,LoginRequest类似于如下的格式:


public class LoginRequest {
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    private String username;
    private String password;
}

那么前端的JSON如何映射到后端LoginRequest中的对应属性之上呢?可以看到LoginRequest中的字段都是private类型,无法直接设置字段值(反射虽然可以设置,但是并不合适),只能通过Setter方法进行设置,但是程序怎么知道JavaBean有哪些Setter方法呢?此处就用到了JavaBean的内省机制。

3、JavaBean内省工具Introspector

Java bean的工具包中提供了java内省工具Introspector,该工具可以通过以下方法获取Java bean 的内省结果BeanInfo(后文详细介绍),获取BeanInfo的流程如下图所示


// 在Object类时候停止检索,可以选择在任意一个父类停止
BeanInfo beanInfo = Introspector.getBeanInfo(JavaBeanDemo.class,Object.class);

4、JavaBean内省结果BeanInfo

通过java的内省工具IntrospectorgetBeanInfo方法,我们可以获取一个JavaBean的内省BeanInfo获取到的BeanInfo包含以下属性:

  • Bean的类相关信息
  • Bean的事件信息
  • Bean的属性信息
  • Bean的方法信息
  • 额外属性信息
  • Component的图标

5、内省结果BeanInfo的类型

BeanInfo只是一个内省结果的接口,Java中对该接口的实现有以下三种

  • ApplicationBeanInfo:Apple desktop相关的JavaBean内省结果
  • ComponentBeanInfo:Java Awt组件的内省结果,如按钮等
  • GenericBeanInfo:通用的内省结果,JEE开发中的内省结果都为该类型

此外,Spring自定义了一个内省结果类型,叫ExtendedBeanInfo,主要用于识别返回值不为空的Setter方法。

6、Spring的BeanUtils.copyProperties

BeanUtils.copyProperties用户在两个对象之间进行属性的复制,底层基于JavaBean的内省机制,通过内省得到拷贝源对象和目的对象属性的读方法和写方法,然后调用对应的方法进行属性的复制。以下为BeanUtils.copyProperties的流程

BeanUtilsJavaBean内省的一些机制进行优化,到这里,大家有没有发现Java内省的一些缺点呢?

7、BeanUtils并发问题优化

Java内省的结果会缓存ThreadGroupContext中,并且通过synchonrized关键字对缓存加(下图中的红框部分),导致同一个线程组中的线程无法并行内省。

SpringBeanUtils在Java内省之上又添加了一层缓存,这层缓存使用ConcurrentHashMap实现,从而提高了内省的效率。

8、BeanUtils Setter属性识别优化

在Java默认的内省过程中,setter方法的返回值必须是null,如果不是null的话,无法识别为有效的JavaBean属性(下图中的红色部分),Spring 自定义了一个BeanInfo ExtendedBeanInfo解决了这个问题。

回到最初提到的spring.beaninfo.ignore,这个配置用来忽略所有自定义的BeanInfo类的搜索.

9、BeanUtils 性能测试

可以看出:BeanUtils花费的时间约为直接复制的50倍以上。


public class BeanUtilsPerfORManceTest {

    public static void main(String[] args){
        // 预热虚拟机
        loopBeanUtils(100000);
        loopCopyByHand(100000);

        // 复制1万次的情况
        System.out.println("\nloop 10000 times:");
        loopBeanUtils(10000);
        loopCopyByHand(10000);

        // 复制1百万次的情况
        System.out.println("\nloop 1000000 times:");
        loopBeanUtils(1000000);
        loopCopyByHand(1000000);

        // 复制1亿次的情况
        System.out.println("\nloop 100000000 times:");
        loopBeanUtils(100000000);
        loopCopyByHand(100000000);
    }

    private static void loopBeanUtils(int loopTimes){
        TestBeanDemo source = new TestBeanDemo();
        TestBeanDemo target = new TestBeanDemo();
        long start = System.currentTimeMillis();
        for (int i=0;i<loopTimes;i++){
            BeanUtils.copyProperties(source,target);
        }
        System.out.println("BeanUtils cost times:"+String.valueOf(System.currentTimeMillis()-start));
    }

    private static void loopCopyByHand(int loopTimes){
        TestBeanDemo source = new TestBeanDemo();
        TestBeanDemo target = new TestBeanDemo();
        long start = System.currentTimeMillis();
        for (int i=0;i<loopTimes;i++){
            target.setField1(source.getField1());
            target.setField2(source.getField2());
            target.setField3(source.getField3());
            target.setField4(source.getField4());
            target.setField5(source.getField5());
        }
        System.out.println("Copy field one by one times:"+String.valueOf(System.currentTimeMillis()-start));
    }

    @Data
    private static class TestBeanDemo{
        private String field1 = UUID.randomUUID().toString();
        private String field2 = UUID.randomUUID().toString();
        private String field3 = UUID.randomUUID().toString();
        private String field4 = UUID.randomUUID().toString();
        private String field5 = UUID.randomUUID().toString();

    }
}

到此这篇关于有关Java中的BeanInfo介绍的文章就介绍到这了,更多相关Java中的BeanInfo内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 有关Java中的BeanInfo介绍

本文链接: https://www.lsjlt.com/news/135332.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 有关Java中的BeanInfo介绍
    目录1、JavaBean介绍2、JavaBean的自省3、JavaBean内省工具Introspector4、JavaBean内省结果BeanInfo5、内省结果BeanInfo的类...
    99+
    2024-04-02
  • Java ThreadPoolExecutor线程池有关介绍
    目录为什么要有线程池线程池状态ThreadPoolExecutor核心参数corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuet...
    99+
    2024-04-02
  • Java中关键字finalfinallyfinalize的区别介绍
    目录1. final1.1 final修饰属性1.2 final修饰方法1.3 final修饰类2. finally3. finalize这三个除了长得像以外,好像没什么联系 1. ...
    99+
    2024-04-02
  • Java中的Final关键字的用法介绍
    这篇文章主要介绍“Java中的Final关键字的用法介绍”,在日常操作中,相信很多人在Java中的Final关键字的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Final关键字的用法介绍...
    99+
    2023-06-16
  • Java中static关键字的介绍和用法
    本篇内容主要讲解“Java中static关键字的介绍和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中static关键字的介绍和用法”吧!用类名去调用static有两层含义: 可以理...
    99+
    2023-06-02
  • Java关键字null的详细介绍
    本篇内容主要讲解“Java关键字null的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java关键字null的详细介绍”吧!一、null是代表不确定的对象Java中,null是一个关键...
    99+
    2023-06-17
  • java中Switch介绍
    定义形式 int i=2;          switch (i){ case 1: System.out.println("1号"); ...
    99+
    2023-09-09
    java Powered by 金山文档
  • java中this关键字的详细使用介绍
    this 的使用:修饰属性和方法,也可以理解为当前对象 this 调用构造器: 1.我们在类的构造器里,可以使用,调用本类中指定的其他构造器 2.构造器中不能通过”thi...
    99+
    2024-04-02
  • Java中的抽象介绍
    目录1.抽象类和抽象方法2.何时在示例中使用抽象类和抽象方法3.封装与数据抽象4.抽象的优点前言: 数据抽象是一种仅向用户显示基本细节的属性。不向用户显示琐碎或非必需的单元。例如:汽...
    99+
    2024-04-02
  • Java中super关键字介绍以及super()的使用
    目录1、super的使用:2、先复习一下this关键字的使用。3、super关键字:总结:1、super的使用: (1)super是一个关键字。 (2)super和this很类似,我...
    99+
    2024-04-02
  • Java关于数组的介绍与使用
    目录一、前言二、数组的定义数组定义的形式:格式1:格式2:三、数组的初始化方式:1.动态初始化动态开辟的示意图:2.静态初始化四、索引访问数组五、数组长度表示六、遍历数组方法一:实例...
    99+
    2024-04-02
  • 关于Python中的元组介绍
    一、元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。 访问元组: 修改元组:  元组的内置函数count, index:   ...
    99+
    2024-04-02
  • MySQL中的相关工具介绍
    这篇文章主要介绍“MySQL中的相关工具介绍”,在日常操作中,相信很多人在MySQL中的相关工具介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中的相关工具介绍”...
    99+
    2024-04-02
  • ASP.NET Core中的Ocelot网关介绍
    目录1.简介2.Ocelot配置2.1基础集成(Basic Implementation)2.2集成IdentityServer(With IdentityServer)2.3多个网...
    99+
    2024-04-02
  • Java中15种锁的介绍
    这篇文章主要介绍“Java中15种锁的介绍”,在日常操作中,相信很多人在Java中15种锁的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中15种锁的介绍”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • JAVA中的SPI思想介绍
    目录1. SPI介绍2. SPI规则3. SPI案例3.1 组件的定义3.2 组件的实现3.3 组件的选用4. SPI原理5. SPI要求6. SPI应用总结1. SPI介绍 SPI...
    99+
    2024-04-02
  • Java中CompletableFuture 的详细介绍
    目录1.概述1.0 创建 CompletableFuture 的对象的工厂方法1.1 non-async 和 async 区别1.1.1 non-async 示例:注册 action...
    99+
    2024-04-02
  • Java 8中的Collectors API介绍
    目录Stream.Collect() 方法CollectorsCollectors.ToList()Collectors.ToUnmodifiableList()Collectors...
    99+
    2024-04-02
  • Java中关于Collections集合工具类的详细介绍
    Collections 是一个操作 Set、List 和 Map 等集合的工具类。 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集...
    99+
    2024-04-02
  • 关于Python中的__init__()方法介绍
    本文主要介绍了Python中的__init__()方法,__init__()方法是Python学习当中重要的基础知识,需要的朋友可以参考下 __init__()方法意义重大的原因有两个。第一个原因是在对象生命周期中初始化是最重要的一步;...
    99+
    2023-09-25
    python microsoft 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作