带你走进javabean的世界之内省机制

           1.在熟悉内省机制之前先让我们了解下什么是javabean以及它特有的规范:

百度百科给的解释如下


我们可以得出如下3点信息:

  1):类必须使用public修饰.
     2):必须保证有公共无参数构造器.
       
           3):包含了属性的操作手段(给属性赋值,获取属性值).

     注意一点: 若:数据类型是boolean,则不叫get方法,而是is方法.

现在我们已经知道了什么是javabean了。一般我们在写实体类的时候都会加上getter和setter方法

2.让我们看看什么是内省,通过查看jdk我们得到如下:

作用:用于查看和操作 javabean 中的属性
      1):查看属性:获取 JavaBean 中的每一个属性名/属性类型
    标准情况下字段和属性名相同,那就是字段的类型就是属性的类型
      2):操作属性:通过 getter 方法获取属性值,通过 setter 方法给属性设置值
学习一个新的知识点,我们需要去掌握一个核心的类 (Class)
内省的核心类: Introspector

我们通过查看jdk去使用Introspector类中的方法:

通过getBeanInfo方法可以得到一个BeanInfo对象。我们再次查看jdk得到有关BeanInfo的信息如下:

通过查看它的方法得到:

可以得到一个PropertyDescriptor类型的数组里面存储的是属性的信息,既然是数组那么我们可以对其进行遍历操作。让我们在通过jdk查看PropertyDescriptor类,如下:

通过这两个方法可以获取属性值就相当于实体类中的getter和setter方法

现在给一个需求:定义一个User实体类,其中有两个属性name,age,通过内省机制的方法去得到属性以及对属性赋值

代码结构如下:

其中的User类:

package com.mywork._02.intro;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class User {
	private String name;
	private int age;

	public User() {

	}

	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

}
其中的IntrospectorUser类如下:

package com.mywork._02.intro;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class IntrospectorUser {
	public static void main(String[] args) throws Exception {
		//利用反射通过字节码创建对象
		User obj = User.class.newInstance();
		//获取javabean的描述对象
		BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class);
		//获取所有的属性描述器
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		//对所有的属性进行遍历操作
		for (PropertyDescriptor pd : pds) {
			//获取属性名
			String strname = pd.getName();
			System.out.println("name:"+strname);
			//获取getter和setter方法
			Method get = pd.getReadMethod();
			Method set = pd.getWriteMethod();
			//对属性进行赋值操作
			if("name".equals(strname)){
				set.invoke(obj, "张凌飞");
			}
			if("age".equals(strname)){
				set.invoke(obj, 23);
			}
		}
		System.out.println(obj);
	}
}
得到的结果:

预期的一样,完成需求。这就是内省机制,可能在这里看不出它的作用。在jdbc中最后封装的时候遍历结果集的时候,就显示出内省的强大了。




























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值