一反射常用API
获取对象
//类全名
String className = "cn.itcast.Admin";
//获取字节码文件
Class<?> clazz = Class.forName(className);
//创建对象 默认构造函数:clazz.newInstance() 不带参数的构造函数创建对象
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);//带参数的构造函数
constructor.newInstance("Jack");//调用带参数的构造函数创建对象
获取属性名称,值
//类全名
String className = "cn.itcast.Admin";
//获取字节码文件
Class<?> clazz = Class.forName(className);
//创建对象
Admin admin = (Admin)clazz.newInstance();
//获取所有的属性名称
Field[] fs = clazz.getDeclaredFields();
//遍历每一个属性
for(Field f : fs)
{
//设置强制访问
f.setAccessible(true);
//名称
String name = f.getName();
//值
f.get(admin);
}
获取方法,调用方法
//类全名
String className = "cn.itcast.Admin";
//获取字节码文件
Class<?> clazz = Class.forName(className);
//创建对象
Admin admin = (Admin)clazz.newInstance();
//获取方法对象
Method m = clazz.getDeclaredMethod("getId");
//调用方法
Object value = m.invoke(admin);
二 泛型的反射
作用:通过反射拿到泛型的实际类型
示例代码:
需求:拿到 public class BaseDao<Accoun> 中的Accoun字符串
//this 表示当前运行类
//this.getClass() 获取当前运行类的字节码
//this.getClass().getGenericSuperclass() 当前运行类的父类
Type type = this.getClass().getGenericSuperclass();
// 强制转换为“参数化类型” 【BaseDao<Account>】
ParameterizedType pt = (ParameterizedType) type;
// 获取参数化类型中,实际类型的定义 【Account.class】
Type[] types = pt.getActualTypeArguments();
// 获取数据的第一个元素:Accout.class
Class clazz = (Class) types[0];
//获取泛型的实际类名
clazz.getSimpleName();