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的学习。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值