关于Java中内省的总结
内省基于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中内省的总结的更多相关文章
- 深入理解Java:内省(Introspector)
深入理解Java:内省(Introspector) 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传 ...
- Java的内省机制
我现在的理解就是,Java的内省机制就是针对JavaBean的,可以获取到类的属性名称,以及属性的Getter和Setter方法,应该是在写框架的时候才会用到内省机制,还有一个地方可以用到内省机制,就 ...
- JDK 之 Java Bean 内省机制
JDK 之 Java Bean 内省机制 JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html) JavaBean 是一种特殊的 Jav ...
- Java中的反射机制(一)
基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...
- java中异常和集合
1. java中处理错误情况有两种,1 Error,2 Exception error是无法处理的,Exception是可以处理的情况. Exception中又有两种情况,RuntimeExcep ...
- JAVA中反射机制四
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射四 利用反射获取类的属性 1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后 ...
- 2018.8.1 Java中的反射和同步详解
为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他 ...
- Java中的类反射
一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- Java中的反射原理以及简单运用(原理+例子)
@ 目录 学习总结 1. 为什么要使用反射 2. 反射的概念 3. Java反射加载过程 4. 反射优缺点 5. 字节码对象理解 6. 获取字节码对象(.class)的三种方式 7. 反射常用API ...
随机推荐
- Golang编程的工程管理
Golang编程的工程管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Intel欲与AMD共同做大PC市场
自从2017年发布锐龙处理器以来,AMD在高性能处理器市场上正在恢复失地,CPU市场份额在今年Q1季度已经提升到了13.3%,要知道一年前不过8.6%而已.前面两代锐龙处理器相比Intel酷睿在单核性 ...
- Console-terminal-tty-shell-kernel
Console-terminal-tty-shell-kernel 1. 先看图表 1.1 简表 1.2 shell与内核的示意图 1.3 Console-terminal-t ...
- 010.Delphi插件之QPlugins,遍历服务接口
这个DEMO注意是用来看一个DLL所拥有的全部服务接口 演示效果如下 代码如下: unit Frm_Main; interface uses Winapi.Windows, Winapi.Messag ...
- 05 MySQL数据类型的选择与使用
数据类型的选择 1.CHAR与VARCHAR 存储/检索的方式不同. CHAR是固定长度,而VARCHAR是可变长度 非SQLMode下,超 ...
- Day 24:XML基础
Q: 什么是XML,为什么学习XML? A:XML为可扩展标记语言. 标签由开发者自己制定的(要按照一定的语法定义)描述带关系的数据(作为软件的配置文件): 包含与被包含的关系 properties文 ...
- 基础知识 SafeSEH DEP ASLR SEHOP
大多是0day书上抄的 1.SafeSEH 机制: 首先:内存中有SEH表的备份(加密过的) 在调用异常出来函数前,RtlDispatchException()函数中的行为: Ⅰ.检查异常处理链是否位 ...
- Golang的运算符-赋值运算符
Golang的运算符-赋值运算符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值运算符概述 常见的赋值运算符: =: 表示赋值运算符,如"a = 100" ...
- CSS - 设置placeholder样式
input::placeholder { font-size: 12px; font-family: Arial; letter-spacing: 5p ...
- java中JDBC当中请给出一个DataSource的HelloWorld例子
在前面 的jdbc的Helloworld程序当中,我们用DriverManager来获取数据库连接.事实上通过这种方法获取数据库连接,是比较耗费计算机资 源的.当然了,这也是没有办法的事儿.就像我们买 ...