动态代理模式

Java动态代理模式深度解析 动态代理的价值:通过解耦核心逻辑与横切关注点,提升代码复用性和可维护性。在 Spring Boot 中的实践默认使用 CGLIB 代理,支持类代理。广泛应用于事务、AOP、数据访问等场景。多 Service 代理方案:通过工厂模式和 Spring 容器管理,实现统一代理逻辑。 阅读详情

自我修养之动态代理模式

什么是代理?
代理:顾名思义就是代为处理的意思,在日常生活中,代理无处不在,比如说代购,代课等等

如何去使用代理以及分析动态代理是如何实现的,下面我将从静态代理开始分析:

场景:
	陈老师是教语文的,有一天陈老师生病了,没办法就请了隔壁老王去代课

首先来看下代理有哪些角色

在这里插入图片描述

Subject 是顶层接口,RealSubject 是真实对象(被代理对象),Proxy Subject是代理对象,代

理对象持有被代理对象的引用,客户端调用代理对象方法,同时也调用被代理对象的方

法,但是在代理对象前后增加一些处理。

静态代理
/**
 * @ Author     :kwj.
 * @ Date       :Created in 22:24 2020/4/5 0005
 * @ Description:顶层接口
 */
public interface Teacher {
    //教书
    public void doTeach();
    
}
/**
 * @ Author     :kwj.
 * @ Date       :Created in 22:24 2020/4/5 0005
 * @ Description:陈老师上课
 */
public class ChenTeacher implements Teacher {
    @Override
    public void doTeach() {
        System.out.println("上课。。。");
    }
}

由于陈老师生病了,需要找隔壁老王代理。

/**
 * @ Author     :kwj.
 * @ Date       :Created in 22:27 2020/4/5 0005
 * @ Description:隔壁老王去代课
 */
public class GeBiLaoWangTeacher implements Teacher {
    //拿到目标对象的引用
    private Teacher targetTeacher;

    public GeBiLaoWangTeacher(Teacher targetTeacher) {
        this.targetTeacher = targetTeacher;
    }

    //代理老师代课
    @Override
    public void doTeach() {
        System.out.println("课前 大家好  我是代理老师 我叫隔壁老王");
        targetTeacher.doTeach();
        System.out.println("同学们下课了");
    }
}

客户端调用

/**
 * @ Author     :kwj.
 * @ Date       :Created in 22:31 2020/4/5 0005
 * @ Description:客户端调用
 */
public class StaticProxyClient {

    public static void main(String[] args) {
        //拿到目标对象
        Teacher targetTeacher = new ChenTeacher();
        //创建代理对象
        Teacher proxyTeacher = new GeBiLaoWangTeacher(targetTeacher);
        //代理上课
        proxyTeacher.doTeach();

    }
}

测试结果如下:

在这里插入图片描述

看到这里,其实我们可以想到一个问题,就是如果有多个目标对象,对目标对象进行代理就需要不断的创建代理类,这样系统中的类就会太多不易维护,那如何去解决这个问题呢?接下来引入动态代理

动态代理

什么是代理代理?

动态代理是java在运行时通过字节码重组技术动态生成class类的技术

目前有两种实现动态代理的方式

  • JDK 特点:目标类需要实现一个接口,并且代理类需要实现InvocationHandler接口
  • Cglib 原理:是通过继承的方式进行实现的

我们主要讨论使用JDK的方式实现动态代理。为了让代理类可以代理所有的目标对象,我们在代理类中的引用则需要设置为Object类型,如下:

/**
 * @ Author     :kwj.
 * @ Date       :Created in 22:42 2020/4/5 0005
 * @ Description:代理类
 * @ Modified By:
 */
public class DynamicProxy implements InvocationHandler {
    private Object target;
    public Object getProxyInstance(Object target){
        this.target = target;
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //参数一 传入当前类的类加载器
        //参数二 目标类使用的接口(可以是多个)
        //参数三 使用了InvocationHandler 也就是当前类对象
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), interfaces, this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //执行目标对象方法前
        before();
        Object result = method.invoke(target, args);
        //执行目标对象方法后
        after();
        return result;
    }

    private void after() {
        System.out.println("after...");
    }

    private void before() {
        System.out.println("before...");
    }
}

客户端进行测试:

/**
 * @ Author     :kwj.
 * @ Date       :Created in 22:51 2020/4/5 0005
 * @ Description:客户端测试类
 * @ Modified By:
 */
public class DynamicProxyTest {

    public static void main(String[] args) {
        DynamicProxy teacherProxy = new DynamicProxy();
        Teacher proxyInstance = (Teacher) teacherProxy.getProxyInstance(new ChenTeacher());
        proxyInstance.doTeach();
    }

}

在这里插入图片描述

ok,到这一步为止,动态代理就算讲完了,可能小伙伴就会有很好奇,这个代理类到底是个什么东西,长什么样子呢?下面我们一探究竟:

我们通过从内存中的对象字节码通过文件流输出到一个新的 class 文件(也就是代理类)

public class DynamicProxyTest {

    public static void main(String[] args) throws IOException {
        DynamicProxy teacherProxy = new DynamicProxy();
        Teacher proxyInstance = (Teacher) teacherProxy.getProxyInstance(new ChenTeacher());
        proxyInstance.doTeach();

        //生成代理类的class文件
        byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Teacher.class});
        FileOutputStream fos = new FileOutputStream("E:\\$Proxy0.class");
        fos.write(bytes);
        fos.flush();
        fos.close();
    }

}

在E盘下找到这个$Proxy0.class文件,直接拖到idea中进行反编译

public final class $Proxy0 extends Proxy implements Teacher {
    private static Method m1;
    private static Method m3;
    private static Method m2;
    private static Method m0;

    public $Proxy0(InvocationHandler var1) throws  {
        super(var1);
    }

    public final boolean equals(Object var1) throws  {
        try {
            return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final void doTeach() throws  {
        try {
            super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m3 = Class.forName("com.wukong.pattern.代理模式.静态代理.Teacher").getMethod("doTeach");
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}

可以看到代理类去继承了Proxy并实现了目标类的接口,对目标类中的doTeach进行了重写从而达到代理的目的。

结合Mybatis来看动态代理在框架中的应用

已SqlSession.getMapper(xxx.class)为例,我们知道这里是去生成一个接口的代理类,那么内部到底是如何出来处理的呢?

首先是调用DefaultSqlSession#getMapper,如下:

  @Override
  public <T> T getMapper(Class<T> type) {
    return configuration.<T>getMapper(type, this);
  }

接下来就是到Configuration#getMapper方法

  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    return mapperRegistry.getMapper(type, sqlSession);
  }

MapperRegistry

  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
      throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
  }

最终就调用到了MapperProxyFactory,顾名思义就是用来生产MapperProxy(即Mapper的代理类)

public class MapperProxyFactory<T> {

  private final Class<T> mapperInterface;
  private final Map<Method, MapperMethod> methodCache = new ConcurrentHashMap<Method, MapperMethod>();

  public MapperProxyFactory(Class<T> mapperInterface) {
    this.mapperInterface = mapperInterface;
  }

  public Class<T> getMapperInterface() {
    return mapperInterface;
  }

  public Map<Method, MapperMethod> getMethodCache() {
    return methodCache;
  }

  @SuppressWarnings("unchecked")
  protected T newInstance(MapperProxy<T> mapperProxy) {
      //标注:mapperProxy就是我们的代理类,那么既然是JDK代理,肯定会实现InvocationHandler
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
  }

  public T newInstance(SqlSession sqlSession) {
    final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
    return newInstance(mapperProxy);
  }
}

如标注部分说明MapperProxy果然实现了InvocationHandler接口

在这里插入图片描述

这样小伙伴们想对动态代理认识是不是又多了一份兴趣呢,欢迎批评指教哦

手把手教你用STM32单片机DIY一个简易PLC(附完整电路图与PCB文件) 本文详细介绍了如何利用STM32单片机DIY一个简易PLC控制器,涵盖硬件设计、电路图解析、PCB布局优化及固件框架实现。通过完整的电路图和PCB文件,帮助读者从元器件选型到工业级优化,逐步构建可靠的PLC系统,特别适合工业自动化爱好者和学习者实践。 阅读详情

相关推荐

实现飞书机器人推送消息到指定群组或者用户

飞书是一个集成了聊天、协作和办公功能的企业级平台,广泛应用于企业内部沟通和协作。飞书机器人(Feishu Bot)是一种强大的工具,允许开发者通过编程接口与飞书进行互动,从而实现自动化消息推送和任务管理。本文将详细介绍如何通过飞书机器人推送消息给指定的人或者群组,帮助您快速上手。

qq_41898196的博客 5866

jdk动态代理学习

一、什么是动态代理 代理:从字面意思来讲,代理就是代为处理的意思。 简单的说就是本来应该由你来完成的工作由别人来替你完成了。举个例子,你在上大学的时候,总是喜欢逃课。因此,你拜托你的同学帮你答到,而自己却窝在宿舍玩游戏... 你的这个同学恰好就充当了代理的作用,代替你去上课。 二、为什么要使用动态代理 原因:使用动态代理可以是我...

sxb0103的博客 435

深入解析SOC芯片设计中DFT OCC与ATPG的协同优化策略

本文深入探讨了在复杂SOC芯片设计中,DFT(可测试性设计)的核心组件OCC(片上时钟控制器)与ATPG(自动测试向量生成)的协同优化策略。文章从基本原理出发,分析了OCC作为测试时钟管理者的关键作用,以及ATPG作为故障检测引擎的工作机制,并重点阐述了二者在测试架构选择、参数对齐、低功耗测试等场景下的协同方法与实战技巧,旨在实现更高的测试覆盖率与更低的测试成本。

efc123456的博客 1034

动态代理模式详解

目录 (一)什么是动态代理模式 (二)动态代理模式入门案例 1.完成一个账户转账的功能 2.v1.0版本为转账添加一个事务 3.v2.0将事务从业务层和从持久层剥离 4.v3.0将事务使用动态代理完成 (一)什么是动态代理模式 动态代理是java的一种设计模式。它的特征就是委托类和代理类具有相同的接口,代理类是在委托类的代码基础上添加了其他功能,比如消息预处理、消息过滤和事后处理消息等。但是实际上业务逻辑还是有委托类去完成的,简单来说,调用委托类的时候是通过代理对象来实现的。 代.

qq_43814760的博客 7071

hMailServer安装配置

hMailServer安装配置 使用宝塔面板上的宝塔邮件服务器2.1版本,进行安装hMailServer。 宝塔在安装hMailServer是有做了一些配置,如果是手工安装需要注意一下配置点: 1、\hMailServer\Bin 目录下增加mysql连接文件libmysql.dll,要去下载32位的。 libmysql.dll下载 链接:https://pan.baidu.com/s/1YGJXzjowlJ9n_MiqB4xiqw 提取码:wz90 2、 需要提前安装mysql,并创建hM.

王者的博客 5867

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码)

本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。

weixin_29313239的博客 283

动态代理的理解及入门

动态代理

黄帅帅的博客 2544

告别手动改代码!用SSC工具5分钟搞定EtherCAT从站动态模块配置(含Excel模板)

本文详细介绍了如何利用SSC工具和Excel模板实现EtherCAT从站动态模块配置的自动化流程。通过零代码修改的动态配置方案,大幅提升工业自动化产线的灵活性和效率,配置时间从平均4小时缩短至8分钟,错误率下降96%。文章包含Excel模板设计、实战演示和避坑指南,助力工程师快速掌握这一高效工具。

weixin_28339967的博客 570

Java设计模式之代理模式(静态、动态)

定义:由于某些原因访问对象(购房者)不能或不想直接和目标对象(开发商)进行访问,需要通过代理(中介)来帮助完成优点代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用代理对象可以扩展目标对象的功能代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性缺点代理模式会造成系统设计中类的数量增加,增加了系统的复杂度在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢真实主题每增加一个业务方法,代理主题也必须同步增加一个业务方法。可以使用。

Bulut0907 762

基于FISCO BCOS 部署可升级的 Solidity存证智能合约

本文介绍了基于FISCOBCOS平台的可升级Solidity存证智能合约实现方案。采用透明代理模式,包含逻辑合约、代理合约和管理合约三部分,支持业务逻辑升级而不影响存储数据。详细阐述了合约架构设计、Solidity代码实现、Go SDK交互流程以及完整的部署升级步骤。方案具有数据持久性、版本兼容性和生产就绪等特点,提供了权限控制、输入验证等安全机制,并包含监控管理工具。该实现为企业级区块链存证应用提供了可靠的基础架构,支持后续功能扩展和定制化开发。

分享AI、区块链技术及应用,未来已来 1514

基于AI的智能开发环境—Trae在Web开发中的应用实战与性能评估【Trae项目实战】

Trae 是一款与 AI 深度集成的开发工具,提供智能问答、代码自动补全和基于 Agent 的 AI 自动编程能力,极大提升开发效率。它具备完备的 IDE 功能,如代码编写、项目管理和源代码管理等,同时还具备强大的 AI 助手,能够提供智能问答、实时代码建议、代码片段生成等服务。开发者可以通过自然语言与 AI 协作,从 0 到 1 开发项目,AI 会根据需求自动生成代码或创建文件。

一键难忘的博客 3万+

Java代理模式快速解析:从静态代理到动态代理

本文深入探讨了代理模式的核心概念、类型划分(静态代理与动态代理)及其典型应用场景,并通过代码示例详细演示了不同实现方式。静态代理以编译时绑定的方式增强功能,而动态代理则通过运行时生成实现高灵活性,特别适用于复杂多变的需求。文章还结合实际案例,展示了代理模式在日志记录、权限控制和分布式系统中的广泛应用,帮助读者全面掌握该模式的理论与实践。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

华为od 面试八股文_Python_02_含答案

华为od 面试八股文_Python_02_含答案

MISAYAONE的博客 4535

设计模式-动态代理

代理模式(Proxy Pattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。这样理解其实有点抽象,现实生活中举几个例子 :明星宣传。

small_kai的博客 2073

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

动态代理模式 -必须要掌握

动态代理模式 点关注不迷路,欢迎再访! 此文章参考于:《JavaEE互联网轻量级框架整合开发》 动态代理的意义在于生成一个占位(又称代理对象),来代理真实对象,从而控制真实对象的访问。 一.代理基本概念 先来谈谈什么是代理模式。假设场景,你是一位软件工程师。客户带着需求去找公司显然不会直接和你谈,而是去找商务谈,此时客户会认为商务就代表公司。 让我们用一张图来表示代理模式的含义,如图 ...

最初的节奏 741

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java的动态代理模式

Java的动态代理模式的工作是: 给你原有的业务逻辑在不修改该逻辑代码的情况下添加新的逻辑,这个目的最直观表现便是在AOP的思想,在此暂且不讨论AOP。 Java动态代理模式的核心思想: 将你要完成的一些事情交给代理去完成,在此·使用魔乐课堂李兴华老师讲课时用到的一个例子:如果你是图书馆管理员,你主要的工作是管理书籍,但现在上头需要让你也能担当保安的责任,那么,我们可以给图书管理员设置一个代

岑慧能 1297

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式之——动态代理模式

设计模式: 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。 正确使用设计模式具有以下优点: 可以提高程序员的思维能力、编程能力和设计能力。 使程序设计更加标准化、代码编制更加I程化,使软件开发效率大大提高,从而缩短软件的开发周期。 使设计的代码可重用性高、可读性强、可靠性高、灵活性.

技匠而已 1万+

装饰者模式与动态代理的区别

装饰者模式与动态代理的区别区别装饰者模式动态代理 区别 装饰者模式: 就是为了给装饰者的方法增强,单纯的是为了在装饰者方法上增加其他功能。是继承的一种替代方案,可以理解为 在不改变接口的前提下,动态扩展对象的功能 例子:孙悟空七十二变 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿时,就可以在天上飞行。而不管悟空怎么...

大榆的Hello Word 2000

java 24种设计模式之二动态代理模式

模式的结构与实现 1. 模式的结构 2. 模式的实现 1.抽象主题AbstractSubject package java设计模式.动态代理模式; interface AbstractSubject { public void request(String str); public void request1();//无效 } 2.真实...

xiaochuangchuang_的博客 184

46、设计模式之动态代理模式

代理模式分为两种,静态代理和动态代理,静态代理简单易懂,对于新手来说便于理解,但实际运用到项目中代码量以及维护量都是非常大的,在企业级项目中不推荐使用这种方式,用于学习或者做毕设还是可以的,本文中只阐述动态代理模式,记录在这用于加深自身理解,同时希望能对您有所帮助。 JDK动态代理 这种方式,只能对实现了接口的类生成代理,JDK动态代理采用委托机制,动态实现接口类,在动态生成的实现类...

众神之翼 196

设计模式之动态代理模式

一、问题 1、什么是动态代理模式 2、动态代理模式的使用方法 3、动态代理模式的使用演示 4、动态代理模式的原理分析 二、解决问题 1、动态代理模式的概念:         所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface。当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生...

qq_41833394的博客 387
上一篇: 手把手教你搭建博客系统
mastertojava
博客等级 码龄9年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值