刚开始学spring,其中涉及到java反射的知识,就简单的总结一下反射的基本使用.
获取字节码的三种方法
Class.forName("name"); //通过类名来获取
Name.class;
new Name().getClass();
获取实例
Class clazz = Class.forName("name");
clazz.newInstance(); //获取无参实例
Constructor c = clazz.getConstructor(Strng.class,int.class); //相同于占位符,表示有参数列表有String,int两个参数
Person p = (Person)c.newInstance("a",1); //然后直接传参就ok
获取类中字段
Field f = Class.getFiled("name"); //获取类中name这个字段(可见的)
Field f2 = Class.getDeclredField("name"); //获得类中字段(不可见的),暴力反射
设置类中字段
***正常操作
f.set(p,"tom"); //将p中的name字段的值修改为tom
***私有操作
f2.setAccessible(true); //去除私有权限
f2.set(p,"tom");
获取运行类中的方法
Method m = clazz.getMethod("print"); //获取类中的方法
m.invoke(p); //运行p中print方法
Method m2 = clazz.getMethod("print",param); //获取带有参数的方法
m.invoke(p,"hello"); //传入参数运行方法
擦除ArrayList泛型(例子)
1、创建list对象
2、获取list对象的Class文件
3、获取list中的方法
4、运用invoke()方法添加数据
ArrayList<Integer> list = new ArrayList<>();
Class clazz = Class.forName("java.util.ArrayList");
Method m = clazz.getMethod("add",Object.class); //获得ArrayList中带有一个参数的add方法
m.invoke(m,"abc"); //就可以在list中加入String类型数据
将反射操作封装成方法
/*
@param:obj 要操作的对象
@param:propertyName 改变字段名称
@param:value 赋予字段的值
*/
public void setProperty(Object obj,String propertyName, Object value){
Class clazz = obj.getClass(); //获取obj的字节码
Filed f = clazz.getDeclaredField(propertyName); //暴力反射obj对象中propertyName字段
f.setAccessible(true); //去除私有属性
f.set(clazz,value); //将propertyName属性赋值为value
}