静态代理和动态代理

本文详细介绍了Java中的代理模式,包括静态代理和动态代理的概念及应用场景。静态代理通过手动创建代理类实现,适用于目标类数量较少的情况,而动态代理则利用JDK的反射机制在运行时动态创建代理类,避免了大量代理类的编写。文中通过实例展示了两种代理模式的使用,动态代理在代码灵活性和维护性上具有优势。
摘要由CSDN通过智能技术生成

什么是代理?

生活中的代理:比如我们生活中比较熟悉的代购、中介、商家等都是属于代理.

什么是静态代理?

1)代理类是自己手工实现的,自己创建一个Java类,表示代理类。

2)同时你所要代理的目标是确定的。

静态代理的特点:

1)实现简单

2)容易理解

当目标类和代理类很多的时候,会you以下情况:

1)当目标类增加了,代理类可能也需要成倍的增加,代理类数量过多。

2)当你的接口中功能增加了,或者修改了,会影响众多的实现类,厂家类,代理都需要修改,影响比较多

举个例子:

结婚是需要婚庆公司帮忙做些事情

public class Text_静态代理 {
    public static void main(String[] args) {
//        没有使用静态代理之前
//        接口多态或者是具体类new
        Mary1 mary = new You1() ;
        mary.mary();
        System.out.println("-----------------------------");
//        使用静态代理
        You1 you = new You1() ;
//        创建代理角色
        Weddinggs weddinggs = new Weddinggs(you);
        weddinggs.mary();

    }
}
//定义一个结婚的接口
interface Mary1{
    void mary() ;
}
//每个人都要结婚
class You1 implements Mary1{//真实角色
    @Override
    public void mary() {
        System.out.println("这不是正在结婚呢嘛");
    }
}
//    婚庆公司==代理角色
class Weddinggs implements Mary1{
    //声明一个接口Mary类型变量
    private Mary1 mary;
    public Weddinggs(Mary1 mary){
        this.mary=mary ;
    }
    public void mary(){
        System.out.println("结婚前需要布置场地");
        mary.mary();
        System.out.println("结婚后需要交付尾款");
    }

}

输出结果为:

 

什么是动态代理?

在代码程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类(静态代理中,代理对象是固定的)。而不用创建类文件,不用写Java文件。

动态代理是在jdk运行期间,动态的创建class字节码并加载到JVM执行

换句话说,动态代理是一种创建Java对象的能力,让你不用创建TaoBao类,就能创建代理类对象。一般创建对象是 new Xx(),那现在动态代理也可以做这个事情。

举个例子:

package com.qf.proxy;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test_动态代理 {
    public static void main(String[] args) {
        Userdiaoimpl userdiaoimpl = new Userdiaoimpl();
        userdiaoimpl.add();
        userdiaoimpl.delete();
        userdiaoimpl.select();
        userdiaoimpl.update();
        System.out.println("------------------------------");
        Userdiaoimpl2 ud2 = new Userdiaoimpl2();
        ud2.add();
        ud2.delete();
        ud2.update();
        ud2.select();
        System.out.println("-------------下面是动态代理---------------");

        Mydtdl mydtdl = new Mydtdl(ud2);
        Userdiao proxyInstance = (Userdiao) Proxy.newProxyInstance(
                ud2.getClass().getClassLoader(),
                ud2.getClass().getInterfaces(),
                mydtdl
        );
        proxyInstance.add();
        proxyInstance.delete();
        proxyInstance.select();
        proxyInstance.update();
    }
}
interface Userdiao{
        void add();//增
        void delete();//删
        void update();//改
        void select();//查
}

class Mydtdl implements InvocationHandler{

    private Object target;

    public Mydtdl (Object target){
        this.target= target ;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("动态:第一步先检查一下");

        Object invoke = method.invoke(target ,args);

        System.out.println("动态:第三步在打印个啥");
        return invoke;
    }
}




class Userdiaoimpl2 implements Userdiao{


    @Override
    public void add() {
        System.out.println("第一步先检查一下");
        System.out.println("第二步直接增加");
        System.out.println("第三步在打印个啥");
    }

    @Override
    public void delete() {
        System.out.println("第一步先检查一下");
        System.out.println("第二步直接删除");
        System.out.println("第三步在打印个啥");
    }

    @Override
    public void update() {
        System.out.println("第一步先检查一下");
        System.out.println("第二步直接修改");
        System.out.println("第三步在打印个啥");
    }

    @Override
    public void select() {
        System.out.println("第一步先检查一下");
        System.out.println("第二步直接查询");
        System.out.println("第三步在打印个啥");
    }
}


class Userdiaoimpl implements Userdiao{

    @Override
    public void add() {
        System.out.println("增加");
    }

    @Override
    public void delete() {
        System.out.println("删除");
    }

    @Override
    public void update() {
        System.out.println("修改");
    }

    @Override
    public void select() {
        System.out.println("查询");
    }
}

输出结果为:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值