参考如下

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

反射

反射案例

   

代理

静态代理

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

反射和代理 随笔 第1张
public interface Dao {
    public void save();
}
View Code

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

反射和代理 随笔 第3张
public class DaoImpl implements Dao{

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

}
View Code

第三步:测试

反射和代理 随笔 第5张
        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

 

  

动态代理

第一步和第二步如上

第三步:测试

反射和代理 随笔 第7张
        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核心包

需要新建一个

反射和代理 随笔 第9张
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

第四步:测试

反射和代理 随笔 第11张
        Dao dao = new DaoImpl();
        CglibProxy c = new CglibProxy(dao);
        Dao daoProxy = (Dao)c.get();
        daoProxy.save();
View Code

 

原理

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄