反射技术

来源:互联网 发布:java开发岗位职责 编辑:程序博客网 时间:2024/05/28 16:12

一反射常用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.classClass clazz = (Class) types[0];//获取泛型的实际类名clazz.getSimpleName();
原创粉丝点击