广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈Java内省机制
  • 261
分享到

浅谈Java内省机制

Java内省机制Java内省 2022-11-13 14:11:17 261人浏览 独家记忆

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

摘要

目录概念JavaBean内省相关api代码案例:获取属性相关信息内省属性的注意事项完整代码概念 JavaBean 在实际编程中,我们常常需要一些用来包装值对象的类,例如Student

概念

JavaBean

在实际编程中,我们常常需要一些用来包装值对象的类,例如Student、 Employee、Order,这些 类中往往没有业务方法,只是为了把需要处理的实体对象进行封装,有这样的特征:

  • 属性都是私有的;
  • 有无参的public构造方法;
  • 对私有属性根据需要提供公有的getXxx方法以及setXxx方法;

比如:属性名称为name,则有getName方法返回属性name值, setName方法设置name值;注意方法的名称通常是get或 set加上属性名称,并把属性名称的首字母大写;这些方法称为getters/setters;getters必须有返回值没有方法参数; setter值没有返回值,有方法参数;

例如下面的例子:

image-20220807140502129

符合这些特征的类,被称为JavaBean;

内省

内省(Inspector)机制就是基于反射的基础, Java语言对Bean类属性、事件的一种缺省处理方法。

只要类中有getXXX方法,或者setXXX方法,或者同时有getXXX及setXXX方法,其中getXXX方 法没有方法参数,有返回值; setXXX方法没有返回值,有一个方法参数;那么内省机制就认为 XXX为一个属性;

例如下面代码

Employee类中根本没有声明age属性,仅仅是声明了这样的getter和setter.内省机制就认为age是属性

package com.shixun.introspector;

public class Employee {
    private String name;
    private Double score;

    // age将被内省认为是属性
    public int getAge(){
        return 30;
    }

    // name将被内省认为是属性
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // score将被内省认为是属性
    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    public static void main(String[] args) {
        

    }
}

相关API

与Java内省有关的主要类及接口有:

  • java.beans.Introspector类: 为获得JavaBean属性、事件、方法提供了标准方法;通常使用其中的getBeanInfo方法返回BeanInfo对象;
  • Java.beans.BeanInfo接口:不能直接实例化,通常通过Introspector类返回该类型对象,提供了返回属性描述符对象(PropertyDescriptor)、方法描述符对象(MethodDescriptor) 、 bean描述符(BeanDescriptor)对象的方法;
  • Java.beans.PropertyDescriptor类:用来描述一个属性,该属性有getter及setter方法;

可以使用PropertyDescriptor类的方法获取属性相关的信息,例如getName方法返回属性的名字:

PropertyDescriptor类中定义了方法可以获取该属性的getter和setter方法

方法方法描述
Method getReadMethod()回属性对应的getter方法对象;
Method getWriteMethod()回属性对应的setter方法对象;

下面我们来用代码深入探究一下:

代码案例:获取属性相关信息

Employee如上面代码所示,继续编写主函数进行测试

首先用BeanInfo接口获取BeanInfo的对象,再通过BeanInfo对象获取PropertyDescriptor属性描述

 //获取BeanInfo的对象
 BeanInfo employeeBeanInfo = Introspector.getBeanInfo(Employee.class);
 //通过BeanInfo对象获取PropertyDescriptor属性描述
 PropertyDescriptor[] propertyDescriptors = employeeBeanInfo.getPropertyDescriptors();
 System.out.println("通过Inspector内省机制获取JavaBean属性======= 打印所有信息 ====================");
 Arrays.stream(propertyDescriptors).forEach(f->{
     System.out.println("====================================");
     System.out.println("属性名:"+f.getName());
     System.out.println("类型:"+f.getPropertyType());
     System.out.println("get方法:"+f.getReadMethod());
     System.out.println("set方法:"+f.getWriteMethod());
 });

// 或者用增强for
System.out.println("通过Inspector内省机制获取JavaBean属性======= 打印所有信息 ====================");
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
	System.out.println("====================================");
    System.out.println("名字:" + propertyDescriptor.getName());
    System.out.println("类型:" + propertyDescriptor.getPropertyType());
    System.out.println("get方法:" + propertyDescriptor.getReadMethod());
    System.out.println("set方法:" + propertyDescriptor.getWriteMethod());
}

运行结果如下:

image-20220807152404930

我们也可以通过反射调用这里获取的get或set方法

//创建Employee的对象
Class<?> clazz = Class.forName("com.shixun.introspector.Employee");
Object employee = clazz.newInstance();

//遍历属性描述对象
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    //打印属性名称
    System.out.println(propertyDescriptor.getName());
    //判断属性名称是不是name
    if (propertyDescriptor.getName().equals("name")) {
        //setter方法
        Method writeMethod = propertyDescriptor.getWriteMethod();
        //调用setName方法
        writeMethod.invoke(employee, "jack");
        //getter方法
        Method readMethod = propertyDescriptor.getReadMethod();
        //调用getName方法
        Object nameValue = readMethod.invoke(employee);
        System.out.println("name属性的值为:" + nameValue);
    }
    //判断属性名称是否为score
    if (propertyDescriptor.getName().equals("score")) {
        //setter方法
        Method scoreWriteMethod = propertyDescriptor.getWriteMethod();
        //调用setScore方法
        scoreWriteMethod.invoke(employee, new Double(3000));
        //getter方法
        Method scoreReadMethod = propertyDescriptor.getReadMethod();
        Object scoreValue = scoreReadMethod.invoke(employee);
        System.out.println("score属性的值为:" + scoreValue);
    }
}
System.out.println("当前对象的信息:"+employee.toString());

运行结果如下所示:

全部代码附在最下方!!!!!!

内省属性的注意事项

  • 很多框架都使用了内省机制检索对象的属性,定义属性名字时,名字最好起码以两个小写字母开头,例如stuName,而不要使用sName,某些情况下,可能会导致检索属性失败;
  • 内省机制检索属性时,是根据getter和setter方法确认属性名字,而不是根据类里声明的成员变量名称决定;

完整代码

package com.shixun.introspector;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Employee {
    private String name;
    private Double score;

    // age将被内省认为是属性
    public int getAge() {
        return 30;
    }

    // name将被内省认为是属性
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // score将被内省认为是属性
    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }

    public static void main(String[] args) throws ClassNotFoundException, IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //获取BeanInfo的对象
        BeanInfo employeeBeanInfo = Introspector.getBeanInfo(Employee.class);

        //通过BeanInfo对象获取PropertyDescriptor属性描述
        PropertyDescriptor[] propertyDescriptors = employeeBeanInfo.getPropertyDescriptors();
//        System.out.println("通过Inspector内省机制获取JavaBean属性======= 打印所有信息 ====================");
//        Arrays.stream(propertyDescriptors).forEach(f->{
//            System.out.println("====================================");
//            System.out.println("属性名:"+f.getName());
//            System.out.println("类型:"+f.getPropertyType());
//            System.out.println("get方法:"+f.getReadMethod());
//            System.out.println("set方法:"+f.getWriteMethod());
//        });
//
//
//
//        System.out.println("通过Inspector内省机制获取JavaBean属性======= 打印所有信息 ====================");
//
//        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
//            System.out.println("名字:" + propertyDescriptor.getName());
//            System.out.println("类型:" + propertyDescriptor.getPropertyType());
//            System.out.println("get方法:" + propertyDescriptor.getReadMethod());
//            System.out.println("set方法:" + propertyDescriptor.getWriteMethod());
//        }

        //创建Employee的对象
        Class<?> clazz = Class.forName("com.shixun.introspector.Employee");
        Object employee = clazz.newInstance();

        //遍历属性描述对象
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            //打印属性名称
            System.out.println(propertyDescriptor.getName());
            //判断属性名称是不是name
            if (propertyDescriptor.getName().equals("name")) {
                //setter方法
                Method writeMethod = propertyDescriptor.getWriteMethod();
                //调用setName方法
                writeMethod.invoke(employee, "jack");
                //getter方法
                Method readMethod = propertyDescriptor.getReadMethod();
                //调用getName方法
                Object nameValue = readMethod.invoke(employee);
                System.out.println("name属性的值为:" + nameValue);
            }
            //判断属性名称是否为score
            if (propertyDescriptor.getName().equals("score")) {
                //setter方法
                Method scoreWriteMethod = propertyDescriptor.getWriteMethod();
                //调用setScore方法
                scoreWriteMethod.invoke(employee, new Double(3000));
                //getter方法
                Method scoreReadMethod = propertyDescriptor.getReadMethod();
                Object scoreValue = scoreReadMethod.invoke(employee);
                System.out.println("score属性的值为:" + scoreValue);
            }
        }

        System.out.println("当前对象的信息:"+employee.toString());
    }
}

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

--结束END--

本文标题: 浅谈Java内省机制

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

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

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

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

下载Word文档
猜你喜欢
  • 浅谈Java内省机制
    目录概念JavaBean内省相关API代码案例:获取属性相关信息内省属性的注意事项完整代码概念 JavaBean 在实际编程中,我们常常需要一些用来包装值对象的类,例如Student...
    99+
    2022-11-13
    Java内省机制 Java内省
  • 浅谈Java锁机制
    目录1、悲观锁和乐观锁2、悲观锁应用3、乐观锁应用4、CAS5、手写一个自旋锁1、悲观锁和乐观锁 我们可以将锁大体分为两类: 悲观锁 乐观锁 顾名思义,悲观锁总是...
    99+
    2022-11-12
  • 浅谈Java 代理机制
    目录一、常规编码方式二、代理模式概述三、静态代理3.1、什么是静态代理3.2、代码示例四、Java 字节码生成框架五、什么是动态代理六、JDK 动态代理机制6.1、使用步骤6.2、代...
    99+
    2022-11-12
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2022-11-12
  • 怎样浅谈Java访问控制机制
    怎样浅谈Java访问控制机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 访问控制机制的原理是:在某些策略配置文件中预定义好某些代码对某些资源具有某些操作权限,当...
    99+
    2023-06-17
  • 【Android】 浅谈Handler机制
    Handler机制产生的原因 在谈论一个机制之前,需要了解这个机制设计出来是为了解决什么问题。 Handler设计出来就是因为UI线程不能进行耗...
    99+
    2022-06-06
    handler机制 handler Android
  • 浅谈Python pygame绘制机制
    pygame绘制机制简介  屏幕控制 pygame.display • 用来控制Pygame游戏的屏幕 • Pygame有且只有一个屏幕 • 屏幕左上角坐标为(0,0) ...
    99+
    2022-06-02
    pygame绘制机制 python pygame
  • 如何进行Java 同步机制浅谈
    如何进行Java 同步机制浅谈,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就...
    99+
    2023-06-03
  • 浅谈Swift派发机制
    目录直接派发函数表派发消息机制派发具体派发直接派发 C++ 默认使用的是直接派发,加上 virtual 修饰符可以改成函数表派发。直接派发是最快的,原因是调用指令会少,还可以通过编译...
    99+
    2022-11-12
  • 浅谈Linux信号机制
    目录一、信号列表1.1、实时信号非实时信号1.2、信号状态1.3、信号生命周期1.4、信号的执行和注销二、信号掩码和信号处理函数的继承2.1、信号处理函数的继承2.2、信号掩码的继承2.3、sigwait 与多线程2...
    99+
    2022-06-03
    Linux 信号机制
  • 浅谈AndroidDialog窗口机制
    目录问题引出Dialog源码分析构造方法show()方法问题引出 //创建dialog 方式一 AlertDialog.Builder builder=new AlertDialo...
    99+
    2022-11-13
  • 浅谈numpy广播机制
    目录Broadcast最简单的广播机制稍微复杂的广播机制广播机制到底做了什么一个正确的经典示例一种更便捷的计算方式Broadcast 广播是numpy对不同形状(shape)的数组进...
    99+
    2023-02-15
    numpy 广播机制
  • 浅谈Java非阻塞同步机制和CAS
    目录什么是非阻塞同步悲观锁和乐观锁CAS什么是非阻塞同步 非阻塞同步的意思是多个线程在竞争相同的数据时候不会发生阻塞,从而能够在更加细粒度的维度上进行协调,从而极大的减少线程调度的开...
    99+
    2022-11-12
  • 浅谈用java实现事件驱动机制
    由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没...
    99+
    2023-05-31
    java 事件处理机制 ava
  • 浅谈Java中的内部类
    最近在讲Java中的内部类,感觉内部类实际上对于初学者用得不多,那么内部类简单的说,其实就是在一个类的内部定义的类。按照定义的情况分为:成员内部类,局部内部类,静态内部类,匿名内部类。成员内部类,就是定义一个当作类的成员变量的类。局部内部类...
    99+
    2023-06-02
  • 浅谈Redis缓冲区机制
    目录Redis缓冲区机制客户端缓冲机制应对输入缓冲区溢出查看输入缓冲区信息如何解决输入缓冲区溢出应对输出缓冲区溢出Monitor命令的执行输出缓冲区设置不合理主从集群中的缓冲区复制缓...
    99+
    2022-11-13
  • 浅谈node的事件机制
    Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 在nodejs的...
    99+
    2022-06-04
    浅谈 机制 事件
  • 浅谈Android Aidl 通讯机制
    服务端: 首先是编写一个aidl文件,注意AIDL只支持方法,不能定义静态成员,并且方法也不能有类似public等的修饰符;AIDL运行方法有任何类型的参数和返回值,在jav...
    99+
    2022-06-06
    aidl Android
  • 浅谈Redis的异步机制
    目录前言一、Redis 的阻塞点4 类交互对象和具体的操作之间的关系:切片集群实例交互时的阻塞点二、可以异步执行的阻塞点三、异步的子线程机制总结前言 命令操作、系统配置、关键机制、硬...
    99+
    2022-11-13
  • 浅谈Servlet的Cookie和Session机制
    目录一、Servlet Cookies1.1 Cookies构成1.2 Servlet操作Cookie方法1.3 代码示例:1.4 验证结果二、Servlet Session2.1 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作