java你只知道反射,可能会不知道内省
2021-03-26 21:28
标签:sys void 抛出异常 相关 常用 system 技术 计算 long 在上一文中我们封装了一个Mybatis通用Mapper。为了获得实体类属性我使用了反射。大多数同学也第一感觉会用反射实现,其实还有一种技术也能实现,这就是内省(Introspector)。 在计算机科学中,内省是指计算机程序在运行时(Runtime)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Runtime)可以访问、检测和修改它本身状态或行为的一种能力。 Java中的内省是对JavaBean属性、的一种缺省处理方法。看了概念是不是有点懵逼,我也一样。所以我们写个例子来看看就知道了。写之前还要搞清楚JavaBean的定义; 属性是私有的。 有无参的public构造方法。 对于这些属性有公开的getter/setter方法。 但是如果有的类比较“调皮” ,有getter/setter没有对应的实体,也容易被内省到,但是会抛出异常。所以遵守规约是一个有利于我们使用内省。 其实 add/remove、is 也认为是操作JavaBean属性的方法,所以我们要小心。 JavaBean一般用来传递数据使用,我们数据库实体类就是一种典型的JavaBean。 请注意我特意没有给 Java中通过 你可以通过 stop 、flag 两个属性来控制内省分析的深度。 然后我们看看 原来是JavaBean的 原来 顾名思义,一定是描述JavaBean的方法的。这里放出一条打印结果。1. 前言
2. 什么是内省
3. Java内省操作
public class UserInfo implements Serializable {
private static final long serialVersionUID = -8938650956516110149L;
private Long userId;
private String name;
private Integer age;
private String time;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
time
属性设置getter/setter
。接下来我就开始演示使用内省来操作实体了。java.beans.Introspector
来进行内省操作。常用的内省操作主要有下面这些,当然还有其它的附加类型。
3.1 BeanInfo
BeanInfo
就是内省对JavaBean的一个整体描述。这里我只想获取UserInfo
的描述信息,所以应该这么写:BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class,Object.class);
3.2 BeanDescriptor
BeanDescriptor
主要有什么:BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
// cn.felord.kono.entity.UserInfo.class
Class> beanClass = beanDescriptor.getBeanClass();
// UserInfo
String name = beanDescriptor.getName();
Class
类型和名称。
3.3 PropertyDescriptors
PropertyDescriptor
是描述JavaBean的成员属性的,我们打印来看看Stream.of(beanInfo.getPropertyDescriptors())
.forEach(System.out::println);
java.beans.PropertyDescriptor[name=age; propertyType=class java.lang.Integer; readMethod=public java.lang.Integer cn.felord.kono.entity.UserInfo.getAge(); writeMethod=public void cn.felord.kono.entity.UserInfo.setAge(java.lang.Integer)]
java.beans.PropertyDescriptor[name=name; propertyType=class java.lang.String; readMethod=public java.lang.String cn.felord.kono.entity.UserInfo.getName(); writeMethod=public void cn.felord.kono.entity.UserInfo.setName(java.lang.String)]
java.beans.PropertyDescriptor[name=userId; propertyType=class java.lang.Long; readMethod=public java.lang.Long cn.felord.kono.entity.UserInfo.getUserId(); writeMethod=public void cn.felord.kono.entity.UserInfo.setUserId(java.lang.Long)]
PropertyDescriptor
包含了成员属性的名称、类型、读的方法、写的方法。注意到没有居然不包含time
属性,因为它没有getter/setter被忽略了。
3.4 MethodDescriptors
java.beans.MethodDescriptor[name=foo; method=public static void cn.felo
上一篇:DDD术语-通用语言、限界上下文
文章标题:java你只知道反射,可能会不知道内省
文章链接:http://soscw.com/index.php/essay/68289.html