java内省

2023-10-30

内省

内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包java.beans 中。

一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:


也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法

package com.part_22.p11;

import java.awt.event.ActionListener;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;

/**
 * java内省 
 */
public class IntrospectorDemo
{
    public static void main(String[] args) throws Exception
    {
        Student s = new Student();
        s.setName("ls");
        s.setAge(1);
        s.setHTML("<hmtl>");

        BeanInfo info = Introspector.getBeanInfo(Student.class, Object.class);
        PropertyDescriptor[] props = info.getPropertyDescriptors();//属性描述
        for (int i = 0; i < props.length; i++)
            //getWriteMethod()可以获得设置方法,然后采用反射去设置属性的值
            System.out.println(props[i].getName() + "  =  " + props[i].getReadMethod().invoke(s, null));

        System.out.println("-------------------");
        MethodDescriptor[] methods = info.getMethodDescriptors();
        for (int i = 0; i < methods.length; i++)
            System.out.println(methods[i].getName());

        System.out.println("-------------------");
        EventSetDescriptor[] events = info.getEventSetDescriptors();
        for (int i = 0; i < events.length; i++)
        {
            System.out.println(events[i].getListenerType().getName());
            for (int j = 0; j < events[i].getListenerMethods().length; j++)
            {
                System.out.println(events[i].getListenerMethods()[j].getName());
            }
        }

    }
}

class Student
{
    private String name;
    private int age;
    private String HTML;

    public void addActionListener(ActionListener al)
    {
    }

    public void removeActionListener(ActionListener al)
    {
    }

    public String getName()
    {
        return name;
    }

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

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public String getHTML()
    {
        return HTML;
    }

    public void setHTML(String html)
    {
        HTML = html;
    }
}



Web 开发框架 Struts 中的 FormBean 就是通过内省机制来将表单中的数据映射到类的属性上,因此要求 FormBean 的每个属性要有 getter/setter 方法。但也并不总是这样,什么意思呢?就是说对一个 Bean 类来讲,我可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile的属性,这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现,不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java内省 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • MySQL允许外部访问

    在从外部往MySQL插入数据是 老是失败 才发现是不允许从外部访问 也找了很多方法都没解决 最后才找到这个 一 安装好MySQL 二 开始修改配置 1 登进MySQL之后 2 输入以下语句 进入mysql库 use mysql 3 更新域属
  • VS Code 编辑器: Monaco Editor 介绍

    Any application that can be written in JavaScript will eventually be written in JavaScript 任何可以用 JavaScript 来写的应用 最终都将用
  • res://ieframe.dll/acr_error.htm错误解决办法

    解决方法 删除Internet Explorer 8 的 JSON 互操作性这个补丁 该补丁编号KB976662 首先进入控制面板 添加 删除程序 显示更新 找到编号KB976662 删除
  • hive排序-order by / sort by / distribute by / cluster by

    1 Order By 全局排序 全局排序 只能有一个reduce 1 1 使用 ORDER BY 子句排序 ASC ascend 升序 默认 DESC descend 降序 1 2 ORDER BY 子句在SELECT语句的结尾 1 3 d
  • Python Numpy数组使用列表索引

    用一个例子理解一下 encoding utf 8 author James J time 2019 05 29 import numpy as np if name main data np array 1 2 3 4 5 6 7 8 9
  • Flutter滚动布局嵌套高度自适应和滑动冲突处理

    在SingleChildScrollView中嵌套ListView 如果不指定ListView高度的话会报错 类似这样的 Exception caught by rendering library The following asserti
  • 【ambari】Ambari 环境安装

    1 概述 转载 Ambari 环境安装
  • python怎么换行输入而不执行_python如何换行继续输入

    编写代码时 一行太长写不下该如何换行继续输入呢 一起来看下python如何换行继续输入吧 python如何换行继续输入 python换行继续输入的方法 1 在一行末尾加上 例如 data11 data21 data31 data41 dat
  • java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

    java lang ClassCastException java lang Integer cannot be cast to java lang String 问题背景 接口中参数为 Map
  • 【华为OD机试】天然蓄水池

    天然蓄水池 题目描述 公元2919年 人类终于发现了一颗宜居星球 X星 现想在X星一片连绵起伏的山脉间建一个天然蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正整数数组s表示 每个元素代表山脉的高度 选取山脉上两个点作为蓄水库的边界
  • 40岁高中老师开源的数据集LAION,改变了生成式AI的未来丨智源大会嘉宾风采

    导读 如今 拥有超过50亿个图文对的 LAION数据集已经成为生成式AI未来的中心 而随之而来的关于如何监管人工智能的争论也日益激烈 在德国北部城市汉堡郊区的一栋房屋前 一个信箱上用铅笔潦草地写着一个单词 LAION 这唯一的记号表明 这栋
  • tflite热帖: Tensorflow量化步骤及生成量化的tflite(2)

    https blog csdn net angela 12 article details 85000072 版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net angela 12 article d
  • vue3嵌入pdf的两种办法

    1 使用embed嵌入 好处 简单 代码量少 功能齐全 缺点 有固定样式 难以修改 不可定制 2 使用vue pdf embed pdf预览 的形式定制嵌入pdf 优点 除了pdf的内容别的都可以修改 可以定制样式 缺点 要自己手写下载 下
  • 麦克纳姆轮(Mecanum Wheel)运动学分析

    0 1 麦克纳姆轮底盘示意图 0 2 运动学逆解概念 逆运动学是决定要达成所需要的姿势所要设置的关节可活动对象的参数的过程 一 底盘运动的分解 我们知道 刚体在平面内的运动可以分解为三个独立分量 X轴平动 Y轴平动 yaw 轴自转 如下图所
  • 调用layui相册层---实现点击图片放大查看

    前言 页面排版过程中可能会出现多个小图片并排排列 但对于查看图片内容来说并不十分方便 引入layui js 图片容器 div class photo box div class photograph show div div css样式 宽
  • 【算法】二叉树的递归遍历C语言实现

    二叉树是一种极其重要的数据结构 以下是二叉树的结构定义 创建 和递归先序 中序 后序 遍历的代码 include
  • execjs安装及相关问题解决

    安装方式 命令行下执行 pip install PyExecJS 但出现一个情况是 pycharm编写代码的时候还是出错 这时 我们可以在这个编辑器里再重新安装一下 pycharm安装第三方库 然后查找pyexecjs 然后再安装就行了 这
  • mysql 缓存策略和解决方案

    mysql的主从复制 1 主库Master节点 接受来自客户端的增 删 改请求 通过IO thread写入到binlog 2 从库slave节点 请求读取主库的binlog 通过IO thread写入本地的relay log 中继日志 3
  • 微信公众号跳转到关注页面办法

    span style color rgb 85 85 85 https mp weixin qq com mp profile ext action home biz span span style color ff0000 MzAxNzc
  • java内省

    内省 内省是 Java 语言对 Bean 类属性 事件的一种缺省处理方法 例如类 A 中有属性 name 那我们可以通过 getName setName 来得到其值或者设置新的值 通过 getName setName 来访问name 属性