反射技术

一反射常用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();
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值