反射和代理

参考如下

反射:https://www.cnblogs.com/fzz9/p/7738381.html

代理:https://www.cnblogs.com/cenyu/p/6289209.html

反射

反射案例

   

代理

静态代理

第一步:创建普通类接口Dao

public interface Dao {
    public void save();
}
View Code

第二步:创建普通类,实现Dao接口

public class DaoImpl implements Dao{

    @Override
    public void save() {
        System.out.println("存钱");
    }

}
View Code

第三步:测试

        class DaoProxy implements Dao {
            private Dao target;
            
            public DaoProxy(Dao target) {
                super();
                this.target = target;
            }

            @Override
            public void save() {
                System.out.println("开始");
                target.save();
                System.out.println("结束");
            }
        }
        Dao target = new DaoImpl();
        DaoProxy daoProxy = new DaoProxy(target);
        daoProxy.save();
View Code

 

  

动态代理

第一步和第二步如上

第三步:测试

        DaoImpl dao = new DaoImpl();
        Dao daoProxy = (Dao)Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始前");
                Object invoke = method.invoke(dao, args);
                System.out.println("开始后");
                return invoke;
            }
        });
        daoProxy.save();
View Code

 Cglib代理

第一步和第二步如上

第三步:新建一个实现代理的类

需要导入spring核心包

需要新建一个

class CglibProxy implements MethodInterceptor{

    private Object target;
    
    public CglibProxy(Object target) {
        super();
        this.target = target;
    }

    //获得代理对象
    public Object get() {
        Enhancer en = new Enhancer();
        en.setSuperclass(target.getClass());
        en.setCallback(this);
        return en.create();
    }

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("开始");
        Object invoke = arg1.invoke(target, arg2);
        System.out.println("结束");
        return invoke;
    }
    
}
View Code

第四步:测试

        Dao dao = new DaoImpl();
        CglibProxy c = new CglibProxy(dao);
        Dao daoProxy = (Dao)c.get();
        daoProxy.save();
View Code

 

原理

转载于:https://www.cnblogs.com/Dbbf/p/10868060.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值