静态代理和jdk动态代理

静态代理

核心思想:让代理角色帮助真实角色来完成一件事;

作用:可以增添相应的业务逻辑,真实角色完成自己的业务逻辑,代理角色帮助真实角色完成业务需求;

特点:代理角色和真实角色实现同一个接口;

举例:

public interface Demo1 {
    public void  marry();

}

public class You implements Demo1 {

    @Override
    public void marry() {
        System.out.println("我要结婚了");
    }
}

public class WeddingCompany implements Demo1 {
    private Demo1 demo1;
    public  WeddingCompany(Demo1 demo1){
        this.demo1=demo1;
    }
    @Override
    public void marry() {
        System.out.println("结婚了 结婚了");
        demo1.marry();
        System.out.println("新郎不是我");
    }
}

public class StaticProxyDemo {
    public static void main(String[] args) {
   You you=new You();
   WeddingCompany weddingCompany=new WeddingCompany(you);
   weddingCompany.marry();

    }
}

动态代理

 Jdk动态代理:
 *          是在程序的执行过程中,通过反射产生的代理对象!
 *        java.lang.reflect.Proxy
 *        jdk动态代理特点:
 *              基于接口实现的
 *        cglib动态代理
 *              基于类实现
 *
 *
 * Proxy
 *        public static Object newProxyInstance(

                                  ClassLoader loader,   参数1:实现的接口的类加载器
 *                               Class<?>[] interfaces,       参数2:基于接口的字节码文件对象数组
 *                               nvocationHandler h)         参数3:是接口InvocationHandler :代理的处理程序
 *                                throws IllegalArgumentException
 *                                                                  参数3是一个接口:自定一个类实现这个接口
 *                                                                  重写这个接口中的
 *                  Object invoke(Object proxy,Method method,Object[] args)throws Throwable

接口: 

public interface Dog {
 
     void eat();
}


          委托类

public class WhiteDog implements Dog{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}


         代理类

public class ProxyHandler implements InvocationHandler {
 
    private Object dog;
 
    public ProxyHandler(Object dog){
        this.dog = dog;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(dog,args);
    }
}


         测试

public class Test {
 
    public void testProxy(){
 
        WhiteDog whiteDog = new WhiteDog();
        Dog dog = (Dog) Proxy.newProxyInstance(Dog.class.getClassLoader(),
                new Class[]{Dog.class},new ProxyHandler(whiteDog));
        dog.eat();
 
 
    }
 
    public static void main(String[] args) {
        Test t = new Test();
        t.testProxy();
    }

动态代理和静态代理的区别:1、静态代理只代理一个类,而动态代理是代理接口下的多个实现类 2、静态代理在编译时就知道要代理的类,而动态代理是在运行期动态生成的代理类。3 、动态代理类不需要实现接口,但是委托类还是需要实现接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值