反射,在java中是非常常见的一功能和操作。
我最常听到的就是,xx框架在什么什么的时候采用的反射,从而达到动态代理的效果等等。然后就什么什么框架因为包含反射所以不安全或者速度不够快等等。
道听途说总是迷茫和羡慕,待我认真看起反射以后,发现也没有想象中的那么难,但却十分的酷炫。
获取字段和赋值字段首先,简单的反射使用,获取字段和赋值字段是我最经常使用的,可以简单的写个通用方法,非常便捷
public static void setValue(Object object, String key, Object value){
try {
Class clazz = object.getClass();
Field field = clazz.getDeclaredField(key);
field.setAccessible(true);
field.set(object, value);
}catch (Exception e){
System.out.println(e);
}
}
public static Object getValue(Object object, String key){
try {
//如果想专门找父类可以用getClass().getSuperclass()
Class clazz = object.getClass();
//获取非public得用getDeclaredField,getField可以获取到父类的
Field field = clazz.getDeclaredField(key);
//此设置重要,大多数字段封装都是私有的,设置以后才能访问非public字段
field.setAccessible(true);
Object value = field.get(object);
return value;
}catch (Exception e){
System.out.println(e);
}
return null;
}
获取方法
用的少就直接复制了,感觉获取方法并不好做通用工具,又要区分多态,还要确认形参个数和类型然后还有返回值类型,感觉如果都知道了,暂时还没想到怎么写工具类,等我再看看
//其实用起来在获取上和字段差距不大
//第一个参数是方法名,后面可以填多个是代表形参类型
Method m = getClass().getMethod("方法名",int.class...);
//非public方法用Class.getDeclaredMethod()
//Method也有setAccessible方法和Field的作用基本一样
m.setAccessible(true);
//对于Method,使用invoke方法就相当于调用Method
//如果是静态方法,invoke第一参数为null
m.invoke(object,1);
获取构造方法
等我明天再继续写,最近换了公司,比较摆,也很迷茫,最近算是收拾收拾准备好好学习,虽然不知道前方是什么在等待着我,但学习总是没错的,共勉



