JDBC--(12)内省、Class类型

博客主要介绍了Java中的Class类型和内省。Class类型是字节码类型,可将所有字节码视为群体类型,还能通过字节码创建对象。内省用于查看和操作JavaBean属性,可获取指定类及父类的字节码属性信息、属性描述器、属性名、get和set方法,还能动态调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Class类型

什么是Class类型
字节码类型 /bin/*.class
所有的字节码把他们当做一个群体类型

通过字节码创建对象
Student stu = Student.class.newInstance();

package com.iris.jdbc.test;

import com.iris.jdbc.domain.Student;

class ClassTest{
	public Class c;
	public ClassTest(Class c) {
		this.c = c;
	}
}
public class Test {
	public static void main(String[] args) throws Exception, Exception {
		ClassTest ct = new ClassTest(Student.class);
		Student st = (Student) ct.c.newInstance();          //(Student)  表示强转 
	}
}

内省

  1. 什么是内省
    用于查看和操作JavaBean中的属性
  2. Introspector
  3. Introspector.getBeanInfo(A.class,B.class);
    1. 获取指定类当中的字节码属性信息
    2. 获取A类及A类父类当中的属性,但是不包括指定的类。
    3. 返回值BeanInfo
  4. BeanInfo
    getPropertyDescriptors()
    1. 获取JavaBean中的属性描述器
    2. 返回的是一个数组(PropertyDescriptor[]
      1. 每一个属性都有描述器
      2. JavaBean中有多个属性,所以返回了一个数组
  5. 获取属性名 pd.getName();
  6. 获取get方法 pd.getReadMethod();
  7. 获取set方法 pd.getWriteMethod
  8. 动态调用方法 方法名.invoke(对象名称,“值”)
package com.iris.jdbc.test;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

import com.iris.jdbc.domain.Student;

class ClassTest{
	public Class c;
	public ClassTest(Class c) {
		this.c = c;
	}
}
public class Test {
	public static void main(String[] args) throws Exception, Exception {
		ClassTest ct = new ClassTest(Student.class);
		Student st = (Student) ct.c.newInstance();          //(Student)  表示强转 
		// 获取指定字节码的属性信息
		BeanInfo beanInfo = Introspector.getBeanInfo(Student.class,Object.class);
		//获取所有的属性描述器
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		
		for (PropertyDescriptor pd : pds) {
			//获取所有属性的名称
			System.out.println(pd.getName());
			//获取get方法
			System.out.println(pd.getReadMethod());
			//获取set方法
			System.out.println(pd.getWriteMethod());
			//调用方法
			pd.getWriteMethod().invoke(st,"zs");
		}
		System.out.println("=====================");
		System.out.println(st.getName());
		System.out.println(st.getAge());
	}
}


BeanHandler.java

package com.iris.jdbc.handle;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;

public class BeanHandler<T> implements IResultHandle<T> {
	private Class<T> classType;
	public BeanHandler(Class<T> classType) {
		this.classType = classType;
	}
	@Override
	public T handle(ResultSet res) throws Exception {
		if(res.next()) {
			//创建一个对象
			T obj = this.classType.newInstance();
			//通过内省来拿属性
			BeanInfo bf = Introspector.getBeanInfo(this.classType,Object.class);
			//获取所有属性描述器
			PropertyDescriptor[] pds = bf.getPropertyDescriptors();
			//遍历每一个属性的描述器
			for (PropertyDescriptor pd : pds) {
				Object val = res.getObject(pd.getName());
				//给对象设置属性值
				pd.getWriteMethod().invoke(obj, val);
			}
			return obj;
		}
		return null;
	}
}

BeanListHandler.java

package com.iris.jdbc.handle;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class BeanListHandler<T> implements IResultHandle<List<T>> {
	
	private Class<T> classType;
	public BeanListHandler(Class<T> classType) {
		this.classType = classType;
	}
	
	@Override
	public List<T> handle(ResultSet res) throws Exception {
		// TODO Auto-generated method stub
		List<T> list = new ArrayList<>();
		while(res.next()) {
			//创建一个对象
			T obj = this.classType.newInstance();
			//通过内省来拿属性
			BeanInfo bf = Introspector.getBeanInfo(this.classType,Object.class);
			//获取所有属性描述器
			PropertyDescriptor[] pds = bf.getPropertyDescriptors();
			//遍历每一个属性的描述器
			for (PropertyDescriptor pd : pds) {
				Object val = res.getObject(pd.getName());
				//给对象设置属性值
				pd.getWriteMethod().invoke(obj, val);
			}
			//把对象存放到集合当中
			list.add(obj);
		}
		return list;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值