刚开始学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
}