Spring-Aop学习的前提——反射+动态代理——3—如何利用反射

首先我们来说第一个问题:
我们顶一个arraylist集合的时候,通常会有泛型约束,比如:
ArrayList array = new ArrayList<>();
我们在array中只能添加Integer类型数据,那么,能否添加String,或者其他Object类型的数据呢?这里我们就可以利用反射来实现:
代码如下:

ArrayList<Integer> array = new ArrayList<>();
        Class c = array.getClass();
        Method m = c.getMethod("add", Object.class);
        m.invoke(array, "hello");
        m.invoke(array, "world");
        System.out.println(array);

1.首先获取集合arraylist的class字节码文件,
2.获取字节码文件中的add方法,形参是Object.class类型,
3.invoke执行,第一个参数是执行的对象,第二个方法是实参。
通过以上就可以实现向集合里添加各种类型的元素

第二个问题:
我们可不可以写一个工具类,来get任何类的任何属性赋值。

public void setProperty(Object obj, String propertyName, Object value)
            throws NoSuchFieldException, SecurityException,
            IllegalArgumentException, IllegalAccessException {
        // 根据对象获取字节码文件对象
Class c = obj.getClass();
        // 获取该对象的propertyName成员变量
Field field = c.getDeclaredField(propertyName);
        // 取消访问检查
field.setAccessible(true);
        // 给对象的成员变量赋值为指定的值
field.set(obj, value);
    }

下面我们写一个测试类:

public class ToolDemo {
    public static void main(String[] args) throws NoSuchFieldException,
            SecurityException, IllegalArgumentException, IllegalAccessException {
        Person1 p = new Person1();
        Tool t = new Tool();
        t.setProperty(p, "name", "林青霞");
        t.setProperty(p, "age", 27);
        System.out.println(p);
        System.out.println("-----------");
        Dog d = new Dog();
        t.setProperty(d, "sex", '男');
        t.setProperty(d, "price", 12.34f);
        System.out.println(d);
    }
}

实践证明,我们是完全可以实现的。
通过以上我们发现,反射是如此强大,接下来我们会依靠反射引出动态代理,和cglib代理,进而进入Aop的学习。

你可能感兴趣的:(Spring学习)