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) 表示强转
}
}
内省
- 什么是内省
用于查看和操作JavaBean中的属性 - 类
Introspector
Introspector.getBeanInfo(A.class,B.class);
- 获取指定类当中的字节码属性信息
- 获取A类及A类父类当中的属性,但是不包括指定的类。
- 返回值BeanInfo
BeanInfo
getPropertyDescriptors()
- 获取JavaBean中的属性描述器
- 返回的是一个数组(
PropertyDescriptor[]
)
1. 每一个属性都有描述器
2. JavaBean中有多个属性,所以返回了一个数组
- 获取属性名
pd.getName();
- 获取get方法
pd.getReadMethod();
- 获取set方法
pd.getWriteMethod
- 动态调用方法
方法名.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;
}
}