内省基于JavaBean规范对反射进行了封装,提供了更加便捷的通过getter/setter方法来访问字段的方式

  • Java内省的知识结构图

  • JavaBean的规范

  JavaBean在现在可以认为就是普通的Java类,JavaBean规范规定一组通用的规则,开发人员在声明类时,都应该遵守这些规则

  1 类中要有一个无参public构造函数

  2 类中字段要使用private修饰

  3 为希望被外界访问的字段提供getter/setter方法,这些字段称为属性

  4 getter方法命名时使用get+属性名称首字母大写形式,比如name属性的getter方法名为getName,setter方法命名方式相似,命名为setName

private String name;

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

  外界可以根据getter/setter方法名反推出属性名,在需要的时候可以让属性名和对应的字段名不一致,从而可以隐藏真正的字段名,具有一定的安全意义等

private String realName;

//根据方法名getName反推出属性名为name,但对应的字段名是realName
public String getName() {
return realName;
}
public void setName(String name) {
this.realName = name;
}

  如无特殊需求,应该让字段名和属性名保持一致

  另外,对于boolean基本类型的字段,比如boolean isMarried,其getter方法也可以是isMarried(),其setter方法也可以是setMarried(value),eclipse等工具默认生成的就是这两个方法,

  不过这两个方法名在有些技术框架中是无效的,会导致程序出错,所以最好使用getIsMarried()和setIsMarried(value),而且建议在项目中使用Boolean类型的字段

  一些特殊的字段名,比如uName这种第二个字母是大写的情况,其getter方法名应该为getuName();再比如URL这种全部大写的情况,其getter方法应该为getURL()。其实大家应该避免让自己声明的字段名成为上面两种情况

  • Java的内省API

  Introspector是内省编程的入口,可以把Class对象解析成BeanInfo对象

BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);

  BeanInfo表示一个符合JavaBean规范的类的信息,可以方便的获得类中的属性

  PropertyDescriptor表示类中的属性,其实包含了属性名,getter和setter方法

BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
PropertyDescriptor[] propDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propDescriptor : propDescriptors) {
String propName = propDescriptor.getName();
if (!"class".equals(propName)) {
Method getter = propDescriptor.getReadMethod();
Method setter = propDescriptor.getWriteMethod();
}
}

  Object声明了getClass()方法来获得对象本身类型的Class对象,由于所有的类都继承自Object,所以所有的类都有getClass()方法。但类中并没有class字段(class是关键字,不可以作为类名),而且也没有setClass()方法,

  所以在使用内省编程的时候一般需要过滤掉“class”属性

关于Java中内省的总结的更多相关文章

  1. 深入理解Java:内省(Introspector)

    深入理解Java:内省(Introspector) 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传 ...

  2. Java的内省机制

    我现在的理解就是,Java的内省机制就是针对JavaBean的,可以获取到类的属性名称,以及属性的Getter和Setter方法,应该是在写框架的时候才会用到内省机制,还有一个地方可以用到内省机制,就 ...

  3. JDK 之 Java Bean 内省机制

    JDK 之 Java Bean 内省机制 JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html) JavaBean 是一种特殊的 Jav ...

  4. Java中的反射机制(一)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  5. java中异常和集合

    1. java中处理错误情况有两种,1  Error,2  Exception error是无法处理的,Exception是可以处理的情况. Exception中又有两种情况,RuntimeExcep ...

  6. JAVA中反射机制四

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射四 利用反射获取类的属性 1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后 ...

  7. 2018.8.1 Java中的反射和同步详解

    为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他 ...

  8. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  9. Java中的反射原理以及简单运用(原理+例子)

    @ 目录 学习总结 1. 为什么要使用反射 2. 反射的概念 3. Java反射加载过程 4. 反射优缺点 5. 字节码对象理解 6. 获取字节码对象(.class)的三种方式 7. 反射常用API ...

随机推荐

  1. Typescript 实战 --- (9)ES6与CommonJS的模块系统

    1.ES6模块系统 1-1.export 导出 (1).单独导出 // a.ts export let a = 1; (2).批量导出 // a.ts let b = 2; let c = 3; ex ...

  2. LabVIEW面向对象的ActorFramework(2)

    二.为什么要学习面向编程? 面向对象编程,如果将上文推荐的两本书读完后,基本上也就有了答案.从自我产品开发的经验中,理解为可以迅速解决中大型程序需求变化时,在不影响其他程序功能的情况下,能够实现新增功 ...

  3. leetcode617 Merge Two Binary Trees

    """ Given two binary trees and imagine that when you put one of them to cover the oth ...

  4. yolov3输出检测图片位置信息

    前言 我们在进行图片识别后需要进行进一步的处理,该文章会介绍:1.怎样取消lables;2.输出并保存(.txt)标记框的位置信息 一.去掉label 在darknet/src/image.c 收索d ...

  5. 十五、React:简单点餐实例:知识点,html解析写法

    一.功能 从首页列表点进去,转到详情页 列表.详情从Api获取 Api列表:http://a.itying.com/api/productlist 详情:http://a.itying.com/api ...

  6. P1085 PAT单位排行

    转跳点:

  7. VMware CentOS网络配置

  8. 批量处理文件的Python程序

    经常批量处理文件,这里有个python的模板,保存一下 这个例子是把目录里面所有子目录的mp3文件放慢0.85倍并保存到./processed/目录下面. #coding=utf-8 import s ...

  9. Python 列表/元组/字典总结

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...

  10. spctl命令返回的结果输入到文本中

    说一下我遇到的问题. mac自动打包完之后上传到苹果商店公正,公正后需要检查一下公正的结果, spctl -a -v LBCast.app #查看是否公证成功   显示如下表示公证成功了,有Notar ...